比较两个未排序的文件并打印每个文件中的唯一元素

时间:2013-01-18 18:29:40

标签: design-patterns unix grep ksh matching

File1中:

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的新手,我正在尝试从每个文件中获取唯一的行并将它们输出到一个新文件中,而不是打印重复项,文件是未排序的。

2 个答案:

答案 0 :(得分:2)

您需要sort -nuniq -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 short for unique)。数组中的键(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

答案 1 :(得分:0)

假设您想要从这两个文件中获得一组唯一的行

sort -u File1 File2 > File3

UPD:-u可能特定于GNU coreutils。如果您的排序不支持,请参阅@sudo_O的答案。

UPD2:事实证明@sudo_O以不同的方式解释了这个问题:我假设应该包含一次重复的行,他认为应该删除它们。如果我是对的,那么sort|uniq是非GNU sort的替代方案。否则,sort|uniq -u是目前为止的最佳解决方案。