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

 ( nemnagyontudom | 2010. április 1., csütörtök - 23:20 )

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ás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

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.

Szia Zahy,

Köszönöm a választ, majd reggel ki is próbálom!

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

Nagyon köszönöm, az utóbbi már kipróbáltam és nagyon jól működik!

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.

Szia bambano,

Természetesen más megoldás is érdekelne!
Azért írtam awk-t mert arról tudom, hogy kb. ilyen feladatokra van.

for i in sim*; do
grep '^Y' $i | tail -1
done >valaszfile.txt

ez ugyanaz, csak natív c, nem interpretált.

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

sikítooooook.....

+1 :)

Ne bántsd. Félreértette a feladatot, mert lehet úgy is értelmezni, ahogy ő értette.
A cím alapján pl. az ő értelmezése a helytálló.

nekem pl. van egy olyan hülye szokásom, hogy a posztot is igyekszem elolvasni, nem csak a címet...

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

Idézet következik: "no comment."

Mi történt? Elfogytak az érvek? :-D

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

Bambano Neked is köszönöm szépen, jól működik a Te verziód is!