我曾经comm
比较两个排序的文件。这些文件中的每一行都是正整数。但结果显示
comm: file 1 is not in sorted order
comm: file 2 is not in sorted order
即使这两个文件已排序,为什么还会出现错误?
答案1
comm
需要字典排序(普通sort
),而不是数字排序(sort -n
)。例如,它需要以下顺序:
1
2000
300
不是以下顺序:
1
300
2000
纠正这个问题,问题就会消失。对于更深奥的情况,其中comm
's 区域设置可能与区域设置不同sort
,您可能需要在其环境中运行sort
和comm
withLC_COLLATE=C
以使用本机字节排序。
答案2
将已排序的文件粘贴到您的问题中,或者深入了解如何对文件进行排序会很有帮助。在大多数情况下,@ChrisDown 的答案应该有效。我的回答解决了初学者有时可能会遇到的问题。
sort file1.txt
打印排序后的输出,但不更改原始文件。因此,当您使用排序时,检查文件是否确实已排序非常重要。
在下面显示的输出中会很清楚。
┌──(user㉿user)-[~/Desktop/abc]
└─$ sort no1.txt
26
67
789
98
┌──(user㉿user)-[~/Desktop/abc]
└─$ cat no1.txt
789
67
98
26
这里排序为我们提供了文件的排序内容,但是当我看到文件的内容时,它显示了原始文件本身。 (原始txt文件请参阅本答案末尾。)
下面显示了将排序后的文件传递给 comm 的一种方法。
- 对每个文件进行排序并将其通过管道传递给 cat 以使用排序后的内容创建一个新文件。
- 将新文件传递给 comm。
┌──(user㉿user)-[~/Desktop/abc]
└─$ cat int1.txt
26
67
789
98
┌──(user㉿user)-[~/Desktop/abc]
└─$ sort no2.txt | cat > int2.txt
┌──(user㉿user)-[~/Desktop/abc]
└─$ comm int1.txt int2.txt
26
45
67
789
88
98
文本文件:
no1.txt
789 67 98 26
no2.txt
789 67 45 88