使用awk或sed比较两个文件

3
这对你来说应该很容易。
以下是file1文件(一列)。
1
2
3
4
5
6
7
8
9

这里是文件2(两列)

2 yay
3 ups
4 wow
8 hey

必须要有一个简单的一行代码来打印出文件1中与文件2不匹配的行。

1
请注意,joincomm 解决方案需要输入文件已排序,这在本问题中恰好是如此。awk 解决方案不关心是否已排序。 - glenn jackman
3个回答

15
 awk 'NR==FNR{a[$1]++;next;}!($0 in a)' file2 file1

或者使用-v参数与join命令结合,就像@Michael建议的那样:

join -v1 file1 file2

两者均将打印:

1
5
6
7
9

你能解释一下你的awk单行代码+1是什么意思吗? :) - jaypal singh
3
@Jaypal 使用 awk 将文件2 存储在一个数组中,索引是 field1;然后对于文件1 中的每一行,检查它是否是数组的一个索引,以进行比较。++ 操作没有什么特殊之处,只是将一个值设置给元素。a[$1]=1; 也可以使用,但 ++ 更快速地输入 :) - Kent

3
您可以通过组合使用cutcomm来实现此操作:
cut -d' ' -f1 file2 | comm -13 - file1

根据您对重复行的处理方式,您可能还需要考虑使用join


2
这个sed解决方案可能适合您:
{ seq 1 10; echo -e "2 yay\n3 ups\n4 wow\n8 hey"; } | sort -n | 
sed '1{h;d};H;${x;s/\(\S\+\)\n\1[^\n]*\n//g;p};d'
1
5
6
7
9
10

解释:先按数字顺序排序文件,然后使用sed将文件混合到保留空间(HS)中。在文件末尾切换到HS,然后删除具有重复键的行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接