サーチ…


2つのファイルの一致するフィールドを確認する

これらの2つのCSVファイルを指定すると、

$ cat file1
1,line1
2,line2
3,line3
4,line4
$ cat file2
1,line3
2,line4
3,line5
4,line6

第2列が第1ファイルにも現れるfile2行を出力するには、次のようにします。

$ awk -F, 'FNR==NR {lines[$2]; next} $2 in lines' file1 file2
1,line3
2,line4

ここで、 lines[]は、各行の第2フィールドの内容でfile1を読み込むときに読み込まれる配列を保持します。

次に、2番目のフィールドが配列内に存在する場合、行$2 in linesの条件$2 in lines file2すべての行についてチェックされます。そうであれば、条件はTrueであり、 awkはデフォルト行為を実行します。これは行全体の印刷で構成されます。

印刷に必要なフィールドが1つだけだった場合、これは次の式になります。

$ awk -F, 'FNR==NR {lines[$2]; next} $2 in lines {print $1}' file1 file2
1
2

2つのファイルを読み込むときにawk変数を出力する

この例が、awkが2つのファイルを処理しているときに、NR、FNRなどのawk内部変数がどのように変化するかを誰もが理解する助けになることを願っています。

awk '{print "NR:",NR,"FNR:",FNR,"fname:",FILENAME,"Field1:",$1}' file1 file2
NR: 1 FNR: 1 fname: file1 Field1: f1d1
NR: 2 FNR: 2 fname: file1 Field1: f1d5
NR: 3 FNR: 3 fname: file1 Field1: f1d9
NR: 4 FNR: 1 fname: file2 Field1: f2d1
NR: 5 FNR: 2 fname: file2 Field1: f2d5
NR: 6 FNR: 3 fname: file2 Field1: f2d9

file1とfile2は次のようになります。

$ cat file1
f1d1 f1d2 f1d3 f1d4

$ cat file2
f2d1 f2d2 f2d3 f2d4

NR値がすべてのファイル間でどのくらい増加し続けるのか注意してくださいFNRは各ファイルでリセットされます。これは、式NR==FNRは、最初のファイルでのみFNR等しいNRを持つことが可能であるため、awkに供給される最初のファイルを常に参照する理由です。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow