问题描述
所以基本上我想做的是逐行比较两个文件2.我怎么能做到这一点?
File_1.txt:
User1 US
User2 US
User3 US
File_2.txt:
User1 US
User2 US
User3 NG
Output_File:
User3 has changed
最佳解决思路
查看diff
命令。这是一个很好的工具,您可以通过在终端中键入man diff
来阅读所有相关信息。
您要做的命令是diff File_1.txt File_2.txt
,它将输出两者之间的差异,应该如下所示:
有关读取第三个命令输出的快速说明:’arrows'(<
和>
)指的是左侧文件(<
)与右侧文件(>
)中该行的值,左侧文件是一个您在命令行中首先输入,在本例中为File_1.txt
此外,您可能会注意到第4个命令是diff ... | tee Output_File
,它将diff
的结果传输到tee
,然后将该输出放入文件中,以便您可以将其保存以供以后使用,如果您不想在控制台右侧查看所有内容那第二个。
次佳解决思路
或者您可以使用Meld Diff
Meld helps you compare files, directories, and version controlled projects. It provides two- and three-way comparison of both files and directories, and has support for many popular version control systems.
通过运行安装:
sudo apt-get install meld
你的例子:
比较目录:
充满文字的示例:
第三种解决思路
您可以使用vimdiff。
例:
vimdiff file1 file2
第四种思路
Meld
是一个非常棒的工具。但您也可以使用diffuse
直观地比较两个文件:
diffuse file1.txt file2.txt
第五种思路
Litteraly坚持问题(file1,file2,输出文件与”has changed”消息)下面的脚本工作。
将脚本复制到空文件中,将其另存为compare.py
,使其可执行,通过以下命令运行:
/path/to/compare.py <file1> <file2> <outputfile>
剧本:
#!/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 <file1> <file2> <outputfile>
要打印到终端窗口:
/path/to/compare.py <file1> <file2>
剧本:
#!/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获得的side-by-side输出
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"
输出将是
a b differ: byte 25, line 3 is 125 U 116 N
第八种思路
补充答案
如果不需要知道文件的哪些部分不同,则可以使用文件的校验和。使用md5sum
或sha256sum
有很多方法可以做到这一点。基本上,它们中的每一个都输出一个文件内容哈希的字符串。如果两个文件相同,则它们的哈希值也相同。这通常在您下载软件时使用,例如Ubuntu安装iso映像。它们通常用于验证下载内容的完整性。
考虑下面的脚本,您可以在其中提供两个文件作为参数,文件将告诉您它们是否相同。
#!/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个列的形式给出输出:第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
安装colordiff
。