mit csinál a getline az awk-n belül?

Ez a következő awk szkript, amely a következő bemeneti fájlt veszi fel, input.txt és az alábbi kimenetet állítja elő. Tudna valaki szánni időt arra, hogy lebontsa a awk szkript működését? Töltöttem rá egy kis időt, és ennek nincs sok értelme.


Input:

$ cat input.txt

FINISHED RSYNCJOBNA 20140502 0021 2182096 2082096 6 5 2014820905820902 10:02:15 2014820905820902 10:56:42 0:54:27 INITIATED RSYNCJOBNA 20140502 0022 3282096 3182096 6 5 2014820905820902 15:31:06 0:06:04 ce eque** 

Kimenet:

RSYNCJOBNA|0021|20140502|10:02:15|10:56:42|0:54:27|FINISHED RSYNCJOBNA|0022|20140502|15:31:06| |0:06:04|INITIATED 

Parancs a fenti ouput megszerzéséhez:

awk -v OFS="|" "/FINISHED|INITIATED/ { status = $1; getline; jobname = $1; getline; sequence = $2; date = $1; getline; start = $2; getline; if (status == "FINISHED") { end = $2; getline } else { end = " " } runtime = $1; print jobname, sequence, date, start, end, runtime, status; }" input.txt 

Megértésem szerint /FINISHED|INITIATED/ {} azt jelenti, hogy a göndör zárójelek belsejében lévő parancsok csak FINISHED vagy INITIATED, de amennyire a kimenetből meg tudom állapítani, úgy tűnik, hogy a szkript minden sorból elemzi. Mi folyik itt?

Megjegyzések

  • Pontosan mit nem értesz '? Semmi? Ebben az esetben: Olvassuk el Önnek az awk kézikönyvét? Ellenkező esetben: Legyen pontos. Az adatokat változókba olvassuk és más sorrendben adjuk ki.
  • Nem ' Nem tudom, hogy mit csinál a fenti parancs getline függvénye. És ha megadjuk az ilyen mintát, /FINISHED|INITIATED/, akkor az awk megkeresi a megfelelő sort, és a műveletet csak az adott soron végzi. De a műveletet minden vonalon elvégezték. Hogyan?
  • @HaukeLaging Mit az adatok változókba olvassák és a kimenetet különböző sorrendben jelentik?

Válasz

A getline függvény beolvassa a következő sort, és áthelyezi a szkriptet. az egymást követő getline hívások a következő sorra lépnek. Ezt talán könnyebb megérteni egy példával:

$ cat input.txt foo 1 2 $ awk "/foo/{print; getline; print; getline; print}" input.txt foo 1 2 

As amint fent látható, a szkript feldolgozza az első sort, mert megfelel az foo szónak. A getline minden hívása beolvassa a sort az aktuális után, így a következő print hívások kinyomtatják a következő sorokat.

Válasz

Ha nem tudja, mit csinál egy awk függvény, akkor a szokásos stratégia megnézni a man oldalt:

getline

A következő beviteli rekordból állítson be 0 dollárt; állítsa be NF, NR, FNR, RT

A parancsblokk valóban csak kétszer kerül végrehajtásra. A többi sort a getline segítségével kezeljük a blokk.

Ezt át lehet írni a következőre:

/FINISHED|INITIATED/ { status = $1; line_number=0; next; } { line_number++; } line_number==1 { jobname = $1; } line_number==2 { sequence = $2; date = $1; } ... 

Megjegyzések

  • Mi történik, ha a következő rekord üres?
  • @AvinashRaj Sem a kódod, sem az alternatívám nem nézi a sorok tartalmát (a /FINISHED|INITIATED/ kivételével ). A sorokat csak visszaszámolják. Az adatokat pontosan el kell rendezni (egy awk parsi-ból) ng perspektíva) az Ön által bemutatott módon, különben a kód megszakad.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük