ファイル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。キーがある場合は、現在の行を印刷する基本操作が実行されます。

答え2

#!/usr/bin/python
k=open('f1','r')
for file1 in k:
    file1_split=file1.split(' ')
    m=open('f2','r')
    for file2 in m:
        file2_split=file2.split(' ')
        if (file1_split[0].strip() == file2_split[1].strip()):
            print file2.strip()
~                              

出力

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

まず、file1を開き、1行ずつ読みます。次にfile2を開き、file1の最初の列1の各行がfile2の列2行と一致することを確認します。一致するものがあれば、file2 の一致行を印刷し、file1 と file2 の次の行を印刷し続けます。

関連情報