如何比较两个文件
所以基本上我想做的是逐行比较两个文件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_File
将diff
的结果传输到一个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
补充答案
如果不需要知道文件的哪些部分不同,则可以使用文件的校验和。 使用md5sum
或sha256sum
有很多方法可以做到这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
。