hvad gør getline inden i awk?

Jeg har dette følgende awk script, der tager følgende inputfil, input.txt og producerer output nedenfor. Kan nogen tage sig tid til at nedbryde, hvordan dette awk script fungerer? Jeg har brugt lidt tid på det, og det giver ikke meget mening.


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

Output:

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

Kommando for at få ovenstående udgang:

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 

Min forståelse er, at /FINISHED|INITIATED/ {} betyder, at kommandoerne inde i de krøllede seler kun køres på linjer, der matcher enten FINISHED eller INITIATED men som så vidt jeg kan se fra output, ser scriptet ud til at parses fra alle linjer. Hvad sker der?

Kommentarer

  • Hvad præcist forstår du ikke '? Intet? I så fald: Skal vi læse awk-manualen for dig? Ellers: Vær præcis. Data læses i variabler og output i anden rækkefølge.
  • Jeg don ' t ved hvad getline-funktionen i ovenstående kommando gør. Og også hvis vi giver mønsteret som dette /FINISHED|INITIATED/, søger awk efter den tilsvarende linje og udfører kun operationen på den pågældende linje. Men operationen blev udført på alle linjerne. Hvordan?
  • @HaukeLaging Hvilke data læses ind i variabler og output i forskellig rækkefølge linie betyder?

Svar

Funktionen getline læser den næste linje og flytter scriptet til det. fortløbende getline opkald flytter til næste linje. Dette er måske lettere at forstå med et eksempel:

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

Som du kan se ovenfor, behandler scriptet den første linje, fordi det matcher foo. Hvert opkald til getline læser linjen efter den aktuelle, så de efterfølgende print opkald udskriver de næste linjer.

Svar

Hvis du ikke ved hvad en awk -funktion gør, er den sædvanlige strategi for at se på mandsiden:

getline

Indstil $ 0 fra næste input-post; indstil NF, NR, FNR, RT

Kommandoblokken udføres faktisk kun to gange. De øvrige linjer håndteres via getline inden for blok.

Dette kunne omskrives til:

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

Kommentarer

  • Hvad sker der, hvis den næste post er tom?
  • @AvinashRaj Hverken din kode eller mit alternativ ser på linjernes indhold (med undtagelse af /FINISHED|INITIATED/ Linjerne tælles bare ned. Dataene skal arrangeres nøjagtigt (fra en awk parsi ng perspektiv) på den måde, du har vist, ellers vil koden bryde.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *