[Megoldva] AWK, sok fájl bizonyos feltételnek megfelelő utolsó sorának egy közös fájlba való kiírása

Fórumok

Sziasztok!

Ismét lenne egy kérdésem a HUP Fórumozóihoz.

Tehát van mondjuk 100 fájlom.
pl. :
sim.001
sim.002
.
.
.
sim.100

Mindegyik egy szimuláció eredményét tartalmazza, sorokban van rendeződve minden sor egy igényre elvégzett szimulációt mutat.

Minden sor elején van egy N vagy Y, majd további eredmény adatok.
Nekem arra lenne szükségem, hogy az utolsó Y-nal kezdődő teljes sort írja ki az awk script egy új fájlba és ez fusson le mind a 100 fájlra, tehát a végén kapjak egy új, 100 soros fájlt.

Fontos lehet, hogy a 100 fájl nem egyenlő hosszúságú.

Előre is köszönöm a segítségeteket!

Hozzászólások

Igy ejfeltajt nem cifrazom awk-kal:


for i in sim.* ; do
awk '/^Y/ { line=$0 }
END {print line }'
' "$i"
done > kozoskimenet

Termeszetesen lehetne (sot valszeg erdemesebb is lenne) osszesen egy db awk-ot futtatni, ehhez fel lehetne hasznalni pl. a FILENAME nevu awk-valtozot.

No itt az egy AWK-os verzio, valszeg ezt is lehet csiszolni meg:


awk '
fn != FILENAME {         # most valtottunk masik fajlra
      if ( NR != 1 )     # es nem ez a legelso sor
            print line   # irjuk ki a megtalalt utolso sort
      fn = FILENAME
      line = ""
      }
/^Y/  {
      line = $0          # eltaroljuk a minket erdeklo adatot
      }
END   {
      if ( line != "" )  # ha az utolso fajlban is volt ilyen sor
             print line  # irjuk ki
      }
' sim.*

Hopp, kell bele egy apró javítás. Ugyanis a feltételből nekem nem egyértelmű, hogy minden fájlban kell lennie Y-nal kezdődő sornak, ha viszont valamelyik fájlban esetleg nincs (és ez nem a legutolsó fájl), akkor annak a fájlnak a feldolgozásakor egy fölösleges üres sor jelenik meg, ami nem megengedhető. Szóval a javított verzió - a javítás az első if-ben történt:


awk '
fn != FILENAME {         # most valtottunk masik fajlra
      if ( line != "" )  # es van kiirni valo sor
            print line   # irjuk ki
      fn = FILENAME
      line = ""
      }
/^Y/  {
      line = $0          # eltaroljuk a minket erdeklo adatot
      }
END   {
      if ( line != "" )  # ha az utolso fajlban is volt ilyen sor
             print line  # irjuk ki
      }
' sim.*

ez csak awk-kal jó vagy normális cuccokkal is?
szerintem az awk elég lassú pl. egy grep-hez meg tail-hez képest.

IMHO a tail és a grep fordítva kell. (Ha helyes a cím.)) Mivel a feladat szerint, az utolsó sorokat kell kigyűjteni, de csak azokat, amelyek Y-nal kezdődnek. A Te verziód az utolsó Y-nal kezdődő sorokat gyűjti ki. Azokat is, amelyen nem a fájl végén vannak. Persze ha ilyen sor csak a fájl végén lehet, akkor ez is jó.

-----
Innen most töltsünk tiszta vizet a nyílt kártyákba: ...

Elolvastam a tartalmi részt is. Mivel a poszt és a cím nem teljesen fedte egymást, ezért a címbeli értelmezést választottam. Az indok roppant egyszerű: még az általános iskolában megtanultam, hogy mindig olyan címet kell választani, ami utal a tartalomra. Úgy véltem, hogy amikor a címet írta, akkor még tudta mit akar, de a hosszú szöveges rész fogalmazása közben kicsit összezavarodott, és elvesztette a fonalat.
Kiegészítés: Ha hozzászólásomban zárójelben szereplő mondatot is elolvastad volna, akkor nem kellett volna sikítoznod.

-----
Innen most töltsünk tiszta vizet a nyílt kártyákba: ...

Szerintem kb. 85% eséllyel lehetett egyik módon értelmezni, meg 15% eséllyel a másik módon. vagy még ennyire sem kétértelmű. Amennyiben a szöveg törzse nem az én verziómat, hanem a sokkal valószínűbb verziót támasztja alá, akkor gyanakodnék, hogy a címet félreértettem.

Az eredeti hozzászólásomból az is kiderül (a zárójeles rész alapján), hogy mindkét értelmezési lehetőséget észrevettem. A hozzászólásom (mint azt jeleztem is) a cím szerinti értelmezésre vonatkozott. Ha Te is alaposan elolvastad a címet, a szöveget, és a hozzászólásomat, akkor nem értem, hogy miért sikítoztál. Ennek semmi köze nincs a százalékokhoz.

-----
Innen most töltsünk tiszta vizet a nyílt kártyákba: ...