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/ {}
かっこ内のコマンドは一致する行でのみ実行されますが、出力FINISHED
でINITIATED
わかる限り、スクリプトは解析中のようです。みんなワイヤー。どうなりますか?
答え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; }
...