getlineはawkで何をしますか?

getlineはawkで何をしますか?

awk次の入力ファイルをインポートしてinput.txt次の出力を生成する次のスクリプトがあります。誰かがawkこのスクリプトの仕組みを説明するのに時間を費やすことはできますか?私はこれについて少し時間を費やしましたが、それほど意味がありません。


入力する:

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

出力:

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

上記の出力を取得するためのコマンド:

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

私が理解したところによると、中/FINISHED|INITIATED/ {}かっこ内のコマンドは一致する行でのみ実行されますが、出力FINISHEDINITIATEDわかる限り、スクリプトは解析中のようです。みんなワイヤー。どうなりますか?

答え1

このgetline関数は次の行を読み、スクリプトをその行に移動します。したがって、連続getline通話は次の回線に移動します。次の例で理解する方が簡単になります。

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

上記のように、スクリプトは一致する最初の行を処理しますfoo。各呼び出しはgetline現在の行の後ろの行を読み取るので、後続のprint呼び出しは次の行を印刷します。

答え2

awk関数の機能がわからない場合の一般的な戦略は、マニュアルページを調べることです。

並ぶ

次の入力レコードから$ 0を設定し、NF、NR、FNR、RTを設定します。

コマンドブロックは実際には2回だけ実行されます。他の行はgetlineブロック内で処理されます。

これは次のように書き直すことができます。

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

関連情報