当前位置: 首页>>技术教程>>正文


如何比较两个文件

, ,

问题描述

所以基本上我想做的是逐行比较两个文件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,它将输出两者之间的差异,应该如下所示:

bash,scripts,ubuntu

有关读取第三个命令输出的快速说明:’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

你的例子:

bash,scripts,ubuntu

比较目录:

bash,scripts,ubuntu

充满文字的示例:

bash,scripts,ubuntu

第三种解决思路

您可以使用vimdiff

例:

vimdiff  file1  file2

第四种思路

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

diffuse file1.txt file2.txt

bash,scripts,ubuntu

第五种思路

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

第八种思路

补充答案

如果不需要知道文件的哪些部分不同,则可以使用文件的校验和。使用md5sumsha256sum有很多方法可以做到这一点。基本上,它们中的每一个都输出一个文件内容哈希的字符串。如果两个文件相同,则它们的哈希值也相同。这通常在您下载软件时使用,例如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你可以看到命令的截图。

bash,scripts,ubuntu

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

bash,scripts,ubuntu

第九种思路

一种简单的方法是使用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选项提供统一的差异。这就是着色差异的样子:

bash,scripts,ubuntu

通过运行sudo apt-get install colordiff安装colordiff

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1619.html,未经允许,请勿转载。