Lenne egy szép hosszú listám
1 alma
2 körte
31 szilva
32 banán
433 eper
435 dinnye
ha van 1-es akkor már 1x, ill 1xx nem lehet, ha van 20 akkor 2xx nem lehet csak 2x stb.
lenne egy szám pl: 43567891234
Ki kell keresni melyik sor illik rá, de előre nem tudni milyen hosszt egyeztessünk.
Ebben a kis példában a "435 dinnye" lesz az illeszkedés.
Gondoltam egy for ciklusra, és ahol addig növelném a karakterszámot, amíg csak 1 eredmény van. De biztos van ennél szebb megoldás.
- 6238 megtekintés
Hozzászólások
Elhamarkodott voltam és nem teljesen körültekintő.
Itt a megoldás:
awk '{pos=index("43567891234", $1); if (pos == 1) print $0; }' lista.txt
- A hozzászóláshoz be kell jelentkezni
Korrekt, és derék, hogy nem hagytad annyiban, de ha már awk, legyen igazán awkos:
awk '43567891234 ~ "^" $1' lista.txt
- A hozzászóláshoz be kell jelentkezni
nemertem. Se a feladatot, se a te megoldasodat.
- A hozzászóláshoz be kell jelentkezni
Most, hogy mondod, már én sem... vagyis értem, hogy először nem értettem, és most is csak sejtem.
Ha jól veszem ki, az adott számra a legrövidebben illeszkedő első mezőt keressük, vagyis a fenti kiegészítendő:
awk '43567891234 ~ "^" $1 {print; exit}' lista.txt
Már ha...
- A hozzászóláshoz be kell jelentkezni
A feladat: megkeresni egy kapott szám leghosszabb illeszkedését egy listában. :)
- A hozzászóláshoz be kell jelentkezni
"ha van 1-es akkor már 1x, ill 1xx nem lehet, ha van 20 akkor 2xx nem lehet csak 2x stb."
Nekem ez baromira semmi erthetot nem jelent.
A mostani magyarazatod jobb. Azaz keresem az 123456789 -et, es vannak/lehetnek olyan sorok, hogy
1 alma
12 korte
123 dinnye
ekkor a 123 dinnye az erdekes? Es ha van 123 dinnye es 123 narancs? Vagy nem lehet olyan?
Igy elso ranezesre nem latom hogy tudnad meguszni a tobbszori keresest, hiszen ha ezek kulonbozo sorban vannak, akkor hiaba adsz meg kulonbozo hosszusagu mintakat, az egyik megtalalja az 1 hosszut, a masik a 2 hosszut. De ezt csak futolag gondoltam at.
Illetve ez jutott eszembe:
$ awk '
/^12345678/ { print ; exit }
/^1234567/ { print ; exit }
/^123456/ { print ; exit }
/^12345/ { print ; exit }
/^1234/ { print ; exit }
/^123/ { print ; exit }
/^12/ { print ; exit }
/^1/ { print ; exit }
' szovegfajl
$
Ez garantaltan az adott sorban a leghosszabbat talalja meg, es ha talalat van, mar abba is hagyja a keresest.
Ket megjegyzes. Szerintem is ronda. Valamint ha nem fix sztringed van, amihez az ember favago modon megirja az egyes mintakat, akkor sokkal valoszinubb, hogy valami olyan kene, hogy:
$ awk '
{ for ( i = length( MINTA ) ; i > 0; i-- ) {
j = substr( MINTA, 1, i )
if ( j == $1 ) {
print $0;
exit;
}
}
}' szovegfajl
vagy valami ilyesmi (Lehet hogy a te awk-s megoldasod is ez?)
(Szerk: volt egy eliras a masodik - altalanos szkriptben, es most nezem, ez a sajat peldamnak se jo.)
Akkor meg varok magyarazatot.)
- A hozzászóláshoz be kell jelentkezni
Mi tagadás, ezt a verziót dekódoltam volna ki utoljára a leírásodból.
Mindenesetre némi not-awk-only csalással* a fenti egysoros reciklálható:
sort -n -r -k1 szovegfile.txt | awk -vMOSTEZTKERESEM=43567891234 'MOSTEZTKERESEM ~ "^" $1 { print; exit}'
* Persze annak semmi akadálya, hogy - feladva az egysorosságot - awk függvénnyel rendezzünk.
- o -
Ez vmi számlatükörféleséghez kell?
- A hozzászóláshoz be kell jelentkezni
Azt kepzelem, hogy ertem. Ha jol gondolom, akkor 12 alma utan se 12 korte, se 123 narancs nem lehet. Ekkor amit irtal, az jo.
- A hozzászóláshoz be kell jelentkezni
Nem lenne egyszerűbb végighaladni a listádon? Végigmégy a sorokon, ellenőrzöd, hogy az első mező prefixe-e a számodnak, ha igen, akkor a sort kinyomtatod.
Sőt, ha egy kicsit menőbbet akarsz, akkor a számodból ki lehet találni, hogy mit kell keresni: mivel 4-essel kezdődik, akkor 4xx lehet csak. A számodnak beolvasod akkor az első három karakterét, és arra keresel rá.
- A hozzászóláshoz be kell jelentkezni
Igen ez teljesen jó megoldás, ha szűkített halmazokkal dolgozom. Bár a lista adott pillanatban ismeretlen.
Pont azt akartam elkerülni, hogy többször kelljen végigmenni az adathalmazon.
- A hozzászóláshoz be kell jelentkezni
De a "menőbb" megoldás már teljesen jó, lentebb juzer megoldása pont ez lesz (első blikkre).
Ha meg több számod van, akkor először legenerálod a keresendő kifejezéseket, majd egy grep "szám1\|szám2\|...\|számn" okossággal megszűröd a fájlodat.
- A hozzászóláshoz be kell jelentkezni
Ez pont a fordítottja annak, amit írtál. Az egész számot keresi, ha nincs találat, akkor megy tovább egyel kevesebb karakterrel.
#!/bin/bash
read keresendo
karakterek=`expr $(echo $keresendo|wc -m) - 1`
echo "A keresendo elem $karakterek karakterbol all"
keresem=$(echo $keresendo|cut -c -$karakterek)
grep ^$keresem lista.txt
while [ $? != 0 ]; do
karakterek=`expr $karakterek - 1`
keresem=$(echo $keresendo|cut -c -$karakterek)
grep ^$keresem lista.txt
done
- A hozzászóláshoz be kell jelentkezni
karakterek=`expr $(echo $keresendo|wc -m) - 1`
helyett pl.
karakterek=${#keresendo}
vagy
keresem=$(echo $keresendo|cut -c -$karakterek)
helyett
keresem="${keresendo%?}"
igy se sporoltam meg az n db grep futast, de legalabb ciklosonkent nehany processzel kevesebb (alshell, abbol alshell-ben echo es cut pl.) fork es exec
(/me kekec: es akkor meg a baromira fontos, de elhagyott idezojelekrol nem is beszeltunk - bar az teny, hogy amig csak szamok lehetnek a keresendo intaban, addig ez nem gond. De a defenziv programozas szerint ez majd egyszer megvaltozik, es akkor szopunk.)
Ja mi a franc az a cut -m opcio? miert nem jo neked a mashol is letezo -c ?
- A hozzászóláshoz be kell jelentkezni
cut -m -et én nem írtam, wc -m szerepel nálam. A többi dologban teljes mértékben igazad van. Ebből is látszik, hogy nem vagyok programozó, csak egy juuzer.
- A hozzászóláshoz be kell jelentkezni