我有两个文件:
- 一个使用
find
文件夹中的命令生成的文件,用于列出文件,按数字对它们进行排序并写入文件, - 另一个是由 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)