文件1:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20
文件2:
9 10 11 12
21 22 23 24
1 2 3 4
17 18 19 20
我是 unix 新手,我正在尝试从每个文件中获取唯一的行并将它们输出到一个新文件中,而不是打印重复项,文件是未排序的。
文件1:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20
文件2:
9 10 11 12
21 22 23 24
1 2 3 4
17 18 19 20
我是 unix 新手,我正在尝试从每个文件中获取唯一的行并将它们输出到一个新文件中,而不是打印重复项,文件是未排序的。
你想要sort -n
并且uniq -u
:
$ sort -n file1 file2 | uniq -u
5 6 7 8
13 14 15 16
21 22 23 24
# Redirect to file3
$ sort -n file1 file2 | uniq -u > file3
编辑:
$ awk '{u[$0]++}END{for(k in u)if(u[k]==1)print k}' file1 file2
5 6 7 8
21 22 23 24
13 14 15 16
这u
是关联数组的名称,您可以将其命名为任何名称(我选择 u 表示唯一)。数组中的键(k)是文件中的行,因此每次看到重复行时计数都会增加。数组构建完成后,我们循环遍历数组,只打印只看到一次的键,这段代码应该有助于清除它:
$ awk '{uniq[$0]++}END{for (key in uniq)print uniq[key]": "key}' file1 file2
2: 9 10 11 12
1: 5 6 7 8
1: 21 22 23 24
1: 13 14 15 16
2: 17 18 19 20
2: 1 2 3 4
假设您想要两个文件中的一组唯一行作为一个整体:
sort -u File1 File2 > File3
UPD:-u
可能特定于 GNU coreutils。如果您的排序不支持它,请参阅@sudo_O 的答案。
UPD2:事实证明@sudo_O 对问题的解释不同:我认为应该包含一次重复的行,他认为应该删除它们。如果我是对的,sort|uniq
那就是 non-GNU 的替代方案sort
。否则,sort|uniq -u
是迄今为止最好的解决方案。