如何比较两个文件

所以基本上我想做的是逐行比较两个文件2.我怎么能做到这一点?

File_1.txt:

User1 US User2 US User3 US 

File_2.txt:

 User1 US User2 US User3 NG 

输出文件:

 User3 has changed 

查看diff命令。 这是一个很好的工具,您可以通过在终端输入man diff来阅读所有相关内容。

你要做的命令是diff File_1.txt File_2.txt ,它将输出两者之间的差异,看起来应该是这样的:

在此处输入图像描述

关于从第三个命令读取输出的快速说明:’箭头’( <> )指的是左侧文件( < )与右侧文件( > )中该行的值,左侧文件为您在命令行中首先输入的那个,在本例中为File_1.txt

另外你可能会注意到第4个命令是diff ... | tee Output_File diff ... | tee Output_Filediff的结果传输到一个tee ,然后将该输出放入一个文件中,这样你就可以保存它以供以后使用,如果你不想在第二个控制台上查看它。

或者你可以使用Meld Diff

Meld可以帮助您比较文件,目录和版本控制的项目。 它提供文件和目录的双向和三向比较,并支持许多流行的版本控制系统。

通过运行安装:

 sudo apt-get install meld 

你的例子:

在此处输入图像描述

比较目录:

在此处输入图像描述

充满文字的示例:

在此处输入图像描述

你可以使用vimdiff 。

例:

 vimdiff file1 file2 

Meld是一个非常棒的工具。 但您也可以使用diffuse直观地比较两个文件:

 diffuse file1.txt file2.txt 

在此处输入图像描述

Litteraly坚持这个问题(file1,file2,outputfile带有“已更改”消息)下面的脚本有效。

将脚本复制到空文件中,将其另存为compare.py ,使其可执行,然后通过以下命令运行:

 /path/to/compare.py    

剧本:

 #!/usr/bin/env python import sys file1 = sys.argv[1]; file2 = sys.argv[2]; outfile = sys.argv[3] def readfile(file): with open(file) as compare: return [item.replace("\n", "").split(" ") for item in compare.readlines()] data1 = readfile(file1); data2 = readfile(file2) mismatch = [item[0] for item in data1 if not item in data2] with open(outfile, "wt") as out: for line in mismatch: out.write(line+" has changed"+"\n") 

使用一些额外的行,您可以将其打印到输出文件或终端,具体取决于输出文件是否已定义:

要打印到文件:

 /path/to/compare.py    

要打印到终端窗口:

 /path/to/compare.py   

剧本:

 #!/usr/bin/env python import sys file1 = sys.argv[1]; file2 = sys.argv[2] try: outfile = sys.argv[3] except IndexError: outfile = None def readfile(file): with open(file) as compare: return [item.replace("\n", "").split(" ") for item in compare.readlines()] data1 = readfile(file1); data2 = readfile(file2) mismatch = [item[0] for item in data1 if not item in data2] if outfile != None: with open(outfile, "wt") as out: for line in mismatch: out.write(line+" has changed"+"\n") else: for line in mismatch: print line+" has changed" 

FWIW,我更喜欢我从diff的并排输出得到的东西

 diff -y -W 120 File_1.txt File_2.txt 

会给出类似的东西:

 User1 US User1 US User2 US User2 US User3 US | User3 NG 

您可以使用命令cmp

 cmp -b "File_1.txt" "File_2.txt" 

输出将是

 ab differ: byte 25, line 3 is 125 U 116 N 

补充答案

如果不需要知道文件的哪些部分不同,则可以使用文件的校验和。 使用md5sumsha256sum有很多方法可以做到这sha256sum 。 基本上,它们中的每一个都输出一个文件内容哈希的字符串。 如果两个文件相同,则它们的哈希值也相同。 这通常在您下载软件时使用,例如Ubuntu安装iso映像。 它们通常用于validation下载内容的完整性。

考虑下面的脚本,您可以在其中提供两个文件作为参数,文件将告诉您它们是否相同。

 #!/bin/bash # Check if both files exist if ! [ -e "$1" ]; then printf "%s doesn't exist\n" "$1" exit 2 elif ! [ -e "$2" ] then printf "%s doesn't exist\n" "$2" exit 2 fi # Get checksums of eithe file file1_sha=$( sha256sum "$1" | awk '{print $1}') file2_sha=$( sha256sum "$2" | awk '{print $1}') # Compare the checksums if [ "x$file1_sha" = "x$file2_sha" ] then printf "Files %s and %s are the same\n" "$1" "$2" exit 0 else printf "Files %s and %s are different\n" "$1" "$2" exit 1 fi 

样品运行:

 $ ./compare_files.sh /etc/passwd ./passwd_copy.txt Files /etc/passwd and ./passwd_copy.txt are the same $ echo $? 0 $ ./compare_files.sh /etc/passwd /etc/default/grub Files /etc/passwd and /etc/default/grub are different $ echo $? 1 

老回答

此外,还有comm命令,它比较两个已排序的文件,并以3个列的forms给出输出:第1列用于文件#1唯一的项目,第2列用于文件#2唯一的项目,第3列用于两个文件中存在的项目。

要禁止任一列,您可以使用开关-1,-2和-3。 使用-3将显示不同的行。

Bellow你可以看到命令的截图。

在此处输入图像描述

只有一个要求 – 必须对文件进行排序才能进行正确比较。 sort命令可用于此目的。 Bellow是另一个截图,其中文件被排序然后进行比较。 从左侧的Bellong开始到File_1的行,从第2列开始的行仅属于File_2

在此处输入图像描述

一种简单的方法是使用colordiff ,其行为类似于diff但是为其输出着色。 这对于阅读差异非常有帮助。 用你的例子,

 $ colordiff -u File_1.txt File_2.txt --- File_1.txt 2016-12-24 17:59:17.409490554 -0500 +++ File_2.txt 2016-12-24 18:00:06.666719659 -0500 @@ -1,3 +1,3 @@ User1 US User2 US -User3 US +User3 NG 

u选项提供统一的差异。 这就是着色差异的样子:

在此处输入图像描述

通过运行sudo apt-get install colordiff