ファイル1の値がファイル2の値と一致しない場合、awkは印刷しません。

ファイル1の値がファイル2の値と一致しない場合、awkは印刷しません。

ファイル1:

G A 4
H B 3
I C 2
J D 1

ファイル2:

M H 6
N H 5
O K 4
P J 3
Q I 2
R I 1
S G 0
T L 1

期待する:

M H 6
N H 5
P J 3
Q I 2
R I 1
S G 0

file2の$ 2がfile1の$ 1と一致する行のみを印刷します。

ifステートメントを生成しようとしていますが、次の構文エラーが発生します。

awk 'NR==FNR{a[NR]=$1; b[NR]=$2; next} ; {if{a[FNR]==b[FNR]}; {next}; { print }' file1 file2

syntax error at source line 1
 context is
    NR==FNR{a[NR]=$1; b[NR]=$2; next} ; >>>  if <<< {a[FNR]==b[FNR]; next}; { print }

あるいは、if動詞を使用しない場合、出力はありません。

awk 'NR==FNR{a[NR]=$1; b[NR]=$2; next} ; {a[FNR]==b[FNR]; next}; { print }' file1 file2

ベストアンサー1

コードが複雑すぎます。この試み:

$ awk 'NR==FNR{a[$1]; next} $2 in a' file1 file2
M H 6
N H 5
P J 3
Q I 2
R I 1
S G 0

説明する:

  1. NR==FNRそのファイルのレコードの総数はファイルのレコード数と等しいため、フィルタはfile1の行のみをフィルタリングします。

  2. 最初のファイル行の場合は、最初のフィールド()を配列のキーとして$1追加し、残りのコマンドをスキップします。aa[$1]next

  3. next最初のファイルのすべての行に適用される最初のブロックを呼び出したので、2番目のフィルタは$2 in a2番目のファイルの行にのみ適用されました。

  4. フィルタは、$2 in a2番目の単語が配列のキーで$2あることを確認しますa。キーがある場合は、現在の行を印刷する基本操作が実行されます。

おすすめ記事