【发布时间】:2012-01-01 04:34:35
【问题描述】:
这对你来说一定很容易
这里是file1(一列)
1
2
3
4
5
6
7
8
9
这里是file2(两列)
2 yay
3 ups
4 wow
8 hey
必须有一个简单的行来打印 file1 中与 file2 不匹配的行
【问题讨论】:
-
请注意,
join和comm解决方案需要对输入文件进行排序,它们恰好在这个问题中。awk解决方案不关心是否未排序。
这对你来说一定很容易
这里是file1(一列)
1
2
3
4
5
6
7
8
9
这里是file2(两列)
2 yay
3 ups
4 wow
8 hey
必须有一个简单的行来打印 file1 中与 file2 不匹配的行
【问题讨论】:
join 和 comm 解决方案需要对输入文件进行排序,它们恰好在这个问题中。 awk 解决方案不关心是否未排序。
您可以通过组合cut 和comm 来做到这一点:
cut -d' ' -f1 file2 | comm -13 - file1
你也可以考虑join,这取决于你想如何处理重复的行。
【讨论】:
awk 'NR==FNR{a[$1]++;next;}!($0 in a)' file2 file1
或使用 -v 连接,正如@Michael 建议的那样:
join -v1 file1 file2
两者都会打印:
1
5
6
7
9
【讨论】:
这个 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,然后删除带有重复键的行。
【讨论】: