まず、awkを使用して最後の行を処理します。

まず、awkを使用して最後の行を処理します。

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段階の方法と大きく異なることはありません。

おすすめ記事