awk
最後のデータポイントに基づいて正規化するために使用したいデータファイルがあります。したがって、最後のデータポイントに最初にアクセスしてデータを正規化してから、正常に処理したいと思います。
2回使用される次の方法はtac
タスクを実行しますが、おそらく必要なものよりも複雑です。
$ cat file
0 5
1 2
2 3
3 4
$ tac file | awk 'NR==1{norm=$2} {print $1, $2/norm}' | tac
0 1.25
1 0.5
2 0.75
3 1
私の質問は:awkだけを使用して上記の結果を得ることができますか?
私は答えが「いいえ、awkはファイルを1行ずつスキャンします」と思いますが、代替案の提案に開いています。
ベストアンサー1
データソースが複数回読み取ることができるファイルである場合(つまり、ストリームではない場合)、最初をtail(1)
使用して最後の行から目的のデータを取得し、次にawkに渡して順番に処理する必要があります。tail
ファイルの前のすべてのデータを読み取らずに最後の行を読み取るには、ファイルの終わりを調べます。
awk -v norm=$(tail -n 1 file | cut -d' ' -f2) '{print $1, $2/norm}' file
これは、ファイル全体がバッファキャッシュに収まらない(つまり、パスごとに1回ずつディスクから2回読み取る必要があることを意味します)、大容量ファイルにとって大きな利点であり、スキャンしなくてもある程度役に立ちます。入力が最後の行に達します。より小さいファイルは、2段階の方法と大きく異なることはありません。