我想就以下问题寻求帮助:
我有两个文件,文件1:
1 apples
2 bananas
3 orange
4 prunes
和文件2:
1 oranges
2 apples
3 nuts
我需要从file2中提取所有与file1不匹配的行(即“3 nuts”)。我写了一个awk
脚本:
#!/bin/awk -f
BEGIN {
while (getline <hdr>0) {
a[i++]=$2;
}
close (hdr);
}
{ for (i in a) {
if (a[i]!=$2) {
print a[i];
}
}
}
我的命令行:
awk -v hdr=file2 -f script_name file1
但我得到的结果只是file2的内容多次。 问题可能是什么?
答案 0 :(得分:3)
您的代码有很多问题(即使是输入文件)。假设行号是您输入的一部分,您可以尝试这个
$ join -v2 -12 -22 -o2.1,2.2 <(sort -k2 file1) <(sort -k2 file2)
将返回
3 nuts
1 oranges
如果你改变&#34;橙&#34;到&#34;橘子&#34;在你的第一个文件中,你只会得到坚果。
类似的功能awk
脚本将是
$ awk 'NR==FNR{a[$2]=$0; next}
$2 in a{delete a[$2]}
END{for(k in a) print a[k]}' file2 file1
3 nuts
1 oranges
注意首先提供file2。
然而,相反,
会更简单$ awk 'NR==FNR{a[$2]; next} !($2 in a)' file1 file2
1 oranges
3 nuts
请注意首先提供file1。