如何将通信输出传输到文件?

时间:2012-02-08 19:21:45

标签: unix

我使用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

7 个答案:

答案 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 按字典顺序排序(如字典中),这是commsort之类的命令(没有-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 sortsort也在抱怨。问题是我正在运行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