无法用 comm/diff 比较两个文件

问题描述

长期潜伏者,第一次发帖。

几天来,我试图比较两个排序的文件,但没有成功。 我尝试了 commdiff,甚至 grep -v -f 。 即使我将它们合并在一起并使用 uniq -c ,它也将每次出现都显示为 1,因此它显然不认为这些行是相同的。 comm 还显示所有 4000 行对于这两个文件都是唯一的。但对于人眼来说,它们是相同的。 file -i 显示它们具有相同的编码。我通过 VI 检查了隐藏字符,它们完全相同。

[root@server tmp]# file -i master.tmp
master.tmp: text/plain; charset=us-ascii
[root@server tmp]# file -i mediaa.tmp
mediaa.tmp: text/plain; charset=us-ascii

我无法分享确切的线条,但它们看起来与此相似:

XXXXX%20(35e4df6a-48dd-43f-921-03942bd4)_1614884940

文件间的唯一区别是它们的创建方式。 一种是直接输出应用命令。另一个是从不同应用程序的输出组合在一起的,必须使用 AWK 进行操作以实现相同的结构。 另一个原因是,一旦我将文本复制到我的记事本++,然后将其复制回终端,它就会开始正常工作。但这是不需要的,整个比较将成为更大脚本的一部分,我需要它是自动的。是否有任何命令可以用来清除文件结构中的任何差异?我找到了 iconv 但我不确定我应该尝试哪种其他编码。 任何想法我在这里缺少什么? 谢谢

解决方法

好的,找到原因了。 sed -n l 显示另一个文件的不同类型的回车。奇怪的是VI :set list 没有显示差异。

,

奇怪的是 VI :set list 没有显示差异。

如果您在加载 CR+NL 文件后立即查看状态行,您会注意到 vi 的不同,文件名旁边会显示 [dos]

如果您只想比较文件,可以将 grep-Z(忽略行尾的空格)选项一起使用。

如果要从 DOS 文件中删除 CR,可以使用 tr -d \\r <withCR >withoutCR