bash fordított keresés

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.

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

"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.)

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?

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á.

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


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 ?