minta számolás - regexp

Jó lenne egy olyan lista, hogy egy adott karakterből (vagy mintából) egy fájl soraiban mennyi van.

Tehát mondjuk olyan sor, amiben 1 db van: 20, olyan sor, amiben két darab van: 9, olyan sor, amiben 3 db van: 42...

mondjuk fogalmam sincs, egy ilyesmit hogy lehetne hatékonyan leírni. Máshonnan indult a dolog, csak tovább gondoltam egy problémát.

Kellett pl. hány sor van, amiben 76 tabulátor van. Erre írtam ezt:
egrep "(.* ){76}" Detail~.txt | wc -l

Szóval ez jó, de most azon kívül más nem jut eszembe, hogy pl. egy ciklussal végigmegyek 1-100 ig, és kiíratom melyik számúból mennyi van. Ráadásul ugye ahol 75-öt találok, az megszámolja azokat is, ahol 76 is megvan.

Esetleg egy ciklussal végigmenni fentről, és a fájlból kitörölni amit egyszer már megszámoltam...

De akkor honnan indulnék? Jobb lenne lentről indulni, amiben legalább egy van, az menjen egy temp fájlba.
Második futásra már ezt nézi, amiben legalább kettő van, menjen egy második fájlba... stb, amíg üres fájl nem lesz a vége

No, gondolom, ennél bizonyára van szebb megoldás is.

Hozzászólások

Valami ilyesmi?


$ cat a.txt
aab
aaa

ba
$ cat a.txt | while read line; do echo $line | grep -o a | wc -l;  done;
2
3
0
1

Jó lenne egy olyan lista, hogy egy adott karakterből (vagy mintából) egy fájl soraiban mennyi van.

Tehát mondjuk olyan sor, amiben 1 db van: 20, olyan sor, amiben két darab van: 9, olyan sor, amiben 3 db van: 42...

Ezt hogy lehetne világosabban leírni?

Egyébként a sort meg számolós dolog az jó.

Hát azt nem tudom, hogy hatékony-e (valszeg nem), de az awk gsub funkcióját fel lehetne erre a feladatra használni:


$ printf '%s\n' alma korte szilva ananasz narancs | awk '{ print gsub( /a/, "", $0 );}'
2
0
1
3
2
$ 

Fenti példa minden sorban az "a" előfordulását számolja meg, de nyilván nem lenne túl bonyolult kb tetszőleges minta előfordulását megszámolni, vagy akár az aktuális sor tartalmát is kiíratni a szám után. Meg persze ha valakinek az awk nem túl ismerős, vagy jobban bízik benne, hasonlót a perl is tud, ez kb ugyanaz (csak a vége) :


... | perl -lpe '$_= s/a//g;'

(Mondjuk nem tudom miért, de nem 0-t, hanem üres sztringet ad vissza, ha nincs mit cserélnie.)