comm 命令行为异常

comm 命令行为异常

我有两个文件:

  1. 一个使用find文件夹中的命令生成的文件,用于列出文件,按数字对它们进行排序并写入文件,
  2. 另一个是由 python 脚本生成的,它没有排序,所以我显式地对它进行数字排序。

问题是我的sort输出只有两列,如下所示:

500016
    500016
500174
    500174
500277
    500277

正如您所看到的,即使常见的条目也单独显示在两列中,而第三列完全丢失,这意味着两个文件之间没有任何共同点,而前三个条目确实是相同的。sort 否则按预期工作以及我制作的一些测试文件。

我知道comm需要对两个文件进行词法排序,这里是我尝试过但失败的选项列表:

comm <(sort file1.txt) <(sort file2.txt)

https://unix.stackexchange.com/a/377689/187419失败的。我还尝试显式提供-d选项sort,并尝试使用字典排序显式重写文件 - 两者都不起作用

comm --check-order <(sort file1.txt) <(sort file2.txt)

https://unix.stackexchange.com/a/186101/187419没有返回任何订单错误;它像往常一样运行,给出两个输出列。

这个解决方案对于与我非常接近的问题也不起作用。

认为可能是因为文件中存在一些额外的字符,我也提到了解决方案这里:set list在 vim 中做。

只是为了测试是否sort引起问题,我特意对我制作的测试文件(comm之前使用过的文件)进行了数字排序,并且comm仍然有效。

我尝试了我能找到的解决方案,但没有成功。还有其他建议吗?

答案1

您几乎肯定是对的,每行上的附加字符都会导致相应的行无法完全匹配。这些附加字符的形式可能是 Windows 样式行终止符中的回车符、空格或制表符,或者可能是其他非打印字符。例如,Python 脚本可能会右对齐数字,以便其中部分或全部数字具有前导空格。

最可靠的做法是过滤掉所有这些不需要的字符,并且由于数据严格是数字,因此这很容易做到,例如sed

sed 's/[^0-9]//g' < input > output

您可以在流程中的各个点插入它。这只是其中之一:

comm <(sed 's/[^0-9]//g' file1.txt | sort) <(sed 's/[^0-9]//g' file2.txt | sort)

相关内容