我使用comm命令比较两个文件,但是我无法将它传递给第三个文件:
comm file1 file2 > file3
comm: file 1 is not in sorted order
comm: file 2 is not in sorted order
我该怎么做? 文件已经排序。
(comm file1 file2工作并打印出来)
样本输入:
文件1:
21
24
31
36
40
87
105
134
...
file2的:
10
21
31
36
40
40
87
103
...
comm file1 file2:works
comm file1 file2 > file3
comm: file 1 is not in sorted order
comm: file 2 is not in sorted order
答案 0 :(得分:4)
你已经按数字排序; comm
适用于词汇排序的文件。
例如,在file2
中,第103行与第21..87行显着无序。您的文件必须是“普通sort
已排序”。
如果您有bash
(4.x),则可以使用流程替换:
comm <(sort file1) <(sort file2)
这会运行这两个命令,并确保comm
进程可以读取标准输出,就好像它们是文件一样。
失败:
(
sort -o file1 file1 &
sort -o file2 file2 &
wait
comm file1 file2
)
这使用并行性来同时对文件进行排序。子shell(在( ... )
中)确保您不会等待其他后台进程完成。
答案 1 :(得分:3)
您的示例数据 NOT 按字典顺序排序(如字典中),这是comm
和sort
之类的命令(没有-n
选项)期待,例如100应该在20之前。
您是否确定在不重定向输出时不是不会注意到错误消息,因为错误会与终端上的输出行混合在一起?
答案 2 :(得分:1)
您必须先使用sort
程序对文件进行排序。
答案 3 :(得分:1)
尝试:
sort -o file1 file1
sort -o file2 file2
comm file1 file2 > file3
答案 4 :(得分:1)
我没有得到与您相同的结果,但也许您的comm
版本抱怨文件未按词汇排序。使用您提供的输入(...
使其变得有趣,我知道它不是您实际文件的一部分。)
$ comm file[12]
10
21
24
31
36
40
40
87
103
...
105
134
...
我很惊讶...
在第三栏中没有,所以我试过了:
$ comm <(sort file1) <(sort file2)
...
10
103
105
134
21
24
31
36
40
40
87
那更好,但是105&gt; 24,对吧?
$ comm <(sort -n file1) <(sort -n file2)
...
10
21
24
31
36
40
40
87
103
105
134
我认为那些是您正在寻找的结果。这两个40
也很有趣。如果你想消除这些:
$ comm <(sort -nu file1) <(sort -nu file2)
...
10
21
24
31
36
40
87
103
105
134
答案 5 :(得分:0)
我遇到了类似的问题,即使我已经comm
sort
,sort
也在抱怨。问题是我正在运行Cygwin,{{1}}指向了一些MSDOS版本(我猜)。通过使用特定路径(在我的例子中为C:\ Cygwin \ bin \ sort),它可以工作。
答案 6 :(得分:0)
我在对文件进行排序时遇到了类似的问题,但在使用时遇到了相同的错误
comm -23 16-unique.log 23-unique.log > 16-only.log
但我认为重定向无法正常工作,所以我尝试了
(comm -23 16-unique.log 23-unique.log ) > 16-only.log
但使用排序来确保排序的输入是业务。
comm -23 <(sort 16-unique.log) <( sort 23-unique.log) > 16-only.log
[另一方面,-23 开关意味着只有第一个文件中的唯一行会出现在输出中] 也man comm