web-dev-qa-db-ja.com

2つのファイルを比較する方法

だから基本的に私がしたいのは、2つのファイルを列2ごとに比較することです。

File_1.txt:

User1 US
User2 US
User3 US

File_2.txt:

User1 US
User2 US
User3 NG

Output_File:

User3 has changed
82
Roboman1723

diffコマンドを調べます。これは優れたツールであり、端末にman diffと入力することで、すべてを読むことができます。

実行したいコマンドはdiff File_1.txt File_2.txtで、2つの違いを出力し、次のようになります。

enter image description here

3番目のコマンドからの出力の読み取りに関する簡単なメモ: '矢印'(<および>)は、左側のファイルの行の値を参照します(<)vs右側のファイル(>)。左側のファイルはコマンドラインで最初に入力したファイルで、この場合はFile_1.txt

さらに、4番目のコマンドがdiff ... | tee Output_Fileであることに気付くかもしれません。これはdiffからの結果をteeにパイプし、その出力をファイルに入れます。すぐにコンソールですべてを表示したくありません。

90
Mitch

または、 Meld Diff を使用できます

Meldは、ファイル、ディレクトリ、およびバージョン管理されたプロジェクトを比較するのに役立ちます。ファイルとディレクトリの両方の2者間および3者間比較を提供し、多くの一般的なバージョン管理システムをサポートしています。

次を実行してインストールします。

Sudo apt-get install meld

あなたの例:

enter image description here

ディレクトリを比較:

enter image description here

テキストの完全な例:

enter image description here

36
Achu

vimdiff を使用できます。

例:

vimdiff  file1  file2
18
Mr. S

FWIW、私はdiffからの並列出力で得られるものが好きです

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

次のようなものを与えるでしょう:

User1 US                            User1 US
User2 US                            User2 US
User3 US                          | User3 NG
12
Mike Reardon

コマンド cmp を使用できます。

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

出力は

a b differ: byte 25, line 3 is 125 U 116 N
9
Maythux

Meldは本当に素晴らしいツールです。ただし、diffuseを使用して、2つのファイルを視覚的に比較することもできます。

diffuse file1.txt file2.txt

enter image description here

8
Meysam

質問(file1、file2、 "has changed"メッセージを含むoutputfile)に固執する以下のスクリプトは機能します。

スクリプトを空のファイルにコピーし、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"
7
Jacob Vlijm

簡単な方法は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オプションは、統一された差分を提供します。これは、色付けされた差分がどのように見えるかです:

enter image description here

Sudo apt-get install colordiffを実行してcolordiffをインストールします。

4
edwinksl

gitをインストールして使用

$ git diff filename1 filename2

そして、あなたは素敵な色のフォーマットで出力を得るでしょう

Gitインストール

$ apt-get update
$ apt-get install git-core
2
Eric Korolev

追加の回答

ファイルのどの部分が異なるかを知る必要がない場合は、ファイルのチェックサムを使用できます。 md5sumまたはsha256sumを使用して、これを行う方法は多数あります。基本的に、それらはそれぞれファイル内容がハッシュする文字列を出力します。 2つのファイルが同じ場合、それらのハッシュも同じになります。これは、Ubuntuインストールisoイメージなどのソフトウェアをダウンロードするときによく使用されます。多くの場合、ダウンロードされたコンテンツの整合性を検証するために使用されます。

以下のスクリプトを検討してください。ここでは、2つのファイルを引数として指定できます。ファイルは、それらが同じかどうかを通知します。

#!/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コマンドがあり、2つのソートされたファイルを比較し、3列で出力します。ファイル1に固有のアイテムの列1、ファイル2に固有のアイテムの列2、存在するアイテムの列3両方のファイルで。

いずれかの列を抑制するには、スイッチ-1、-2、および-3を使用できます。 -3を使用すると、異なる行が表示されます。

以下に、実行中のコマンドのスクリーンショットを見ることができます。

enter image description here

要件は1つだけです。ファイルを適切に比較するには、ファイルをソートする必要があります。 sortコマンドはその目的に使用できます。 Bellowは、ファイルを並べ替えて比較する別のスクリーンショットです。 File_1への左側の先頭から始まる行のみ、列2から始まる行はFile_2のみに属します

enter image description here

2