~からこの問題、私は次の解決策で答えた。
awk 'FNR==NR{a[FNR]=$2;next}{$NF=a[FNR]}1' file2 file1
期待どおりに動作します。
しかし、私の心に浮かぶ最初の解決策は次のとおりです。
$ awk 'FNR==NR{a[FNR]=$2;next}$NF=a[FNR]' file2 file1
A 63 9 6
B 45 3 5
awk
whenが最初の行を印刷しないため、機能しませんfile1
。これは私を驚かせ、なぜawk
最初の行をスキップするのかわかりません。
ここにいくつかの例があります。
$ awk 'FNR==NR{next}$1=123' file2 file1
123 23 8 T
123 63 9 9
123 45 3 J
$ awk 'FNR==NR{a[FNR]=$2;next} FNR in a' file2 file1
A 23 8 T
A 63 9 9
B 45 3 J
awk
どちらの例も期待どおりに機能することがわかります。まず、レコード値に影響を与える現在のレコードのフィールドに新しい値を割り当て、awk
新しい値を印刷します。 2番目は、のすべてのawk
レコードが処理され、file2
スキップされたレコードがないことを示しています。
awk
最初のソリューションで最初の行をスキップするのはなぜですか?
私はそれを使用しgawk 4.0.1
てテストしましたmawk 1.3.3
。
ベストアンサー1
あなたは:
$NF=a[FNR]
最終条件(印刷するかどうかを決定する条件)です。 Assignmentは割り当てられた値を返します(この場合)a[FNR]
。質問をリンクするデータファイルの最初の行は次のとおりです。
A 0
a[FNR]
に初期化されます$2
。これはa[FNR]
、isの値0
がawkの偽の値であることを意味します。これは、割り当てがfalseであることを意味し、これは条件をfalseにし、デフォルトの印刷動作を抑制します。データファイルを次のように変更した場合:
A 1
A 6
B 0
これにより、最初の行は印刷されますが、最後の行は失われます。
したがって、最初の行が欠落しているのではなく、最後のフィールドが0(または空白)の行です。まさに最初の行で、最初の行だけです。