在 ubuntu 中比较两个文本文件的内容?

在 ubuntu 中比较两个文本文件的内容?

我需要比较文本文件的内容(作为一个整体而不是像 diff 命令那样逐行比较)并打印出缺失的文本。有没有命令可以这样做?提前致谢。

编辑:例如,假设 file1 具有:

1 2 3
4 5

文件 2 有:

1 5
2 3 4 6

我想比较这些文件并打印为输出:

6

该命令diff逐行比较文本文件,在这种情况下,几乎整个文件都会被打印出来。(我的实际文件更复杂、更长,所以我举了一个简单的例子。)

答案1

由于顺序无关紧要,您可以使用 awk 打印唯一的行,但使用空格分隔行:

awk -v RS='[[:space:]]+' 'FNR==NR {a[$0]++; next} {a[$0]--} END {for (i in a) if (a[i] != 0) print i}' file1 file2

这里:

  • -v RS='[[:space:]]+'将记录分隔符(RS)设置为任何空格,因此所有每一“行”都将由任何空格(包括换行符)分隔。
  • FNR == NR-是当前文件的FNR记录号 ( )(或者,如果您愿意,也可以称为行号) ,是所有输入文件的总行号。因此,只要这两个相等,我们就处理的是第一个文件。NRNR
  • {a[$0]++; next}- 设置并增加当前“行”出现的次数,然后移至下一行而不处理任何其他规则。此块仅针对第一个文件运行,因此效果是此规则适用于第一个文件中的行,而下一个块适用于所有其他文件。
  • {a[$0]--},减少当前“行”出现的次数。
  • END {for (i in a) if (a[i] != 0) print i}- 在所有输入的末尾,对于数组中的每个条目a,如果出现次数不为 0,则打印该条目。因此,在两个文件中出现次数相等的任何“行”都将被跳过。

答案2

这是另一种解决方案:

comm -3 <( cat file1 | tr ' \t' '\n' | sort) <(cat file2 | tr ' \t' '\n' | sort) | sort -u

在哪里:

  • tr ' \t' '\n' | sort用换行符替换空格和制表符,并重新排序结果
  • comm逐行比较已排序的文件file1,并使用选项抑制两个文件中出现的行file2-3
  • sort -u最后,删除重复的行,这是在出现重复标记的情况下所必需的

在这种情况下,tr ' ' '\n' | sort输出被用作comm命令的标准输入。

答案3

另一个解决方案(python):

def readFile(fi):
  return open(fi,"rb").read().decode(cod)
def process(text):
  return text.replace("\n"," ").split(" ")

print(set([x for x in process(readFile(file1,"utf-8")) if not x==""]).difference(set([x for x in process(readFile(file2,"utf-8")) if not x==""])))

答案4

我会做出以下假设:您的文件由数据组成,这些数据要么用空格或换行符分隔,并且您不关心数据丢失的位置(或者知道它始终在 file2 中)。

我们要做的很简单:将两个文件中的每个空格替换为换行符,将它们连接起来,然后仅搜索单个(唯一)条目:

sort <( tr ' ' '\n' < file1 ) <(tr ' ' '\n' < file2) | uniq -u

相关内容