如果文件 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) 添加为 array 的键a,其中a[$1].然后我们跳过其余的命令next

  3. 由于我们调用了next适用于第一个文件的所有行的第一个块,因此第二个过滤器$2 in a仅适用于第二个文件的行。

  4. 过滤器$2 in a检查第二个单词是否$2是 array 中的键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 并逐行读取,然后打开 file2 并检查每一行 file1 第一行列 1 是否与 file2 的任何行 column2 匹配。如果匹配,则打印 file2 匹配的行,并继续打印 file1 和 file2 的下一行

相关内容