だから基本的に私がしたいのは、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
diff
コマンドを調べます。これは優れたツールであり、端末にman diff
と入力することで、すべてを読むことができます。
実行したいコマンドはdiff File_1.txt File_2.txt
で、2つの違いを出力し、次のようになります。
3番目のコマンドからの出力の読み取りに関する簡単なメモ: '矢印'(<
および>
)は、左側のファイルの行の値を参照します(<
)vs右側のファイル(>
)。左側のファイルはコマンドラインで最初に入力したファイルで、この場合はFile_1.txt
さらに、4番目のコマンドがdiff ... | tee Output_File
であることに気付くかもしれません。これはdiff
からの結果をtee
にパイプし、その出力をファイルに入れます。すぐにコンソールですべてを表示したくありません。
または、 Meld Diff を使用できます
Meldは、ファイル、ディレクトリ、およびバージョン管理されたプロジェクトを比較するのに役立ちます。ファイルとディレクトリの両方の2者間および3者間比較を提供し、多くの一般的なバージョン管理システムをサポートしています。
次を実行してインストールします。
Sudo apt-get install meld
あなたの例:
ディレクトリを比較:
テキストの完全な例:
FWIW、私はdiffからの並列出力で得られるものが好きです
diff -y -W 120 File_1.txt File_2.txt
次のようなものを与えるでしょう:
User1 US User1 US
User2 US User2 US
User3 US | User3 NG
Meld
は本当に素晴らしいツールです。ただし、diffuse
を使用して、2つのファイルを視覚的に比較することもできます。
diffuse file1.txt file2.txt
質問(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"
簡単な方法は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
をインストールします。
gitをインストールして使用
$ git diff filename1 filename2
そして、あなたは素敵な色のフォーマットで出力を得るでしょう
Gitインストール
$ apt-get update
$ apt-get install git-core
ファイルのどの部分が異なるかを知る必要がない場合は、ファイルのチェックサムを使用できます。 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を使用すると、異なる行が表示されます。
以下に、実行中のコマンドのスクリーンショットを見ることができます。
要件は1つだけです。ファイルを適切に比較するには、ファイルをソートする必要があります。 sort
コマンドはその目的に使用できます。 Bellowは、ファイルを並べ替えて比較する別のスクリーンショットです。 File_1への左側の先頭から始まる行のみ、列2から始まる行はFile_2のみに属します