文件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
解释:
过滤器
NR==FNR
仅过滤 file1 中的行,因为对于该文件,总记录数将与文件记录数相同对于第一个文件的行,我们将第一个字段 (
$1
) 添加为 array 的键a
,其中a[$1]
.然后我们跳过其余的命令next
由于我们调用了
next
适用于第一个文件的所有行的第一个块,因此第二个过滤器$2 in a
仅适用于第二个文件的行。过滤器
$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 的下一行