web-dev-qa-db-ja.com

Linux端末で2つのファイルを比較する

"a.txt" "b.txt"という2つのファイルがあります。 - )両方とも単語のリストを持っています。今、私はどの単語が "a.txt"で余分であり、 "b.txtではないかを確認したいです。 "

2つの辞書を比較する必要があるので、効率的なアルゴリズムが必要です。

146
Ali Imran

これが私の解決策です。

mkdir temp
mkdir results
cp /usr/share/dict/american-english ~/temp/american-english-dictionary
cp /usr/share/dict/british-english ~/temp/british-english-dictionary
cat ~/temp/american-english-dictionary | wc -l > ~/results/count-american-english-dictionary
cat ~/temp/british-english-dictionary | wc -l > ~/results/count-british-english-dictionary
grep -Fxf ~/temp/american-english-dictionary ~/temp/british-english-dictionary > ~/results/common-english
grep -Fxvf ~/results/common-english ~/temp/american-english-dictionary > ~/results/unique-american-english
grep -Fxvf ~/results/common-english ~/temp/british-english-dictionary > ~/results/unique-british-english
0
Ali Imran

もしvimがインストールされているのなら、これを試してください。

vimdiff file1 file2

または

vim -d file1 file2

あなたはそれが素晴らしいと思うでしょう。enter image description here

312
Fengya Li

それらを並べ替えてcommを使う:

comm -23 <(sort a.txt) <(sort b.txt)

commは入力ファイルを(ソートして)比較し、デフォルトで3つの列を出力します。aに固有の行、bに固有の行、および両方に存在する行です。 -1-2、および/または-3を指定することで、対応する出力を抑制することができます。したがってcomm -23 a bはaに固有のエントリだけをリストします。私は<(...)構文を使ってファイルをその場でソートします。すでにソートされているのであれば、これは必要ありません。

58

2つのファイルを比較するためにlinuxでdiffツールを使うことができます。必要なデータをフィルタリングするには、 - 変更グループフォーマットおよび - 変更グループフォーマットオプションを使用できます。

以下の3つのオプションを使用して、各オプションに関連するグループを選択できます。

  • '%<'はFILE1から行を取得します

  • '%>'はFILE2から行を取得します

  • 両方のファイルから行を削除するための ''(空の文字列)。

例:diff - 変更グループ形式= "%<" - 未変更グループ形式= "" file1.txt file2.txt

[root@vmoracle11 tmp]# cat file1.txt 
test one
test two
test three
test four
test eight
[root@vmoracle11 tmp]# cat file2.txt 
test one
test three
test nine
[root@vmoracle11 tmp]# diff --changed-group-format='%<' --unchanged-group-format='' file1.txt file2.txt 
test two
test four
test eight
26
Manjula

sdiffman sdiff)を試してください

sdiff -s file1 file2
26
mudrii

git diffからのdiff出力スタイルを好むなら、gitリポジトリにないファイルを比較するためにそれを--no-indexフラグと一緒に使うことができます:

git diff --no-index a.txt b.txt

それぞれに約200kのファイル名文字列を含む2、3のファイルを使用して、(組み込みのtimeコマンドを使用して)このアプローチと他のいくつかの回答を比較しました。

git diff --no-index a.txt b.txt
# ~1.2s

comm -23 <(sort a.txt) <(sort b.txt)
# ~0.2s

diff a.txt b.txt
# ~2.6s

sdiff a.txt b.txt
# ~2.7s

vimdiff a.txt b.txt
# ~3.2s

commはこれまでで最も速いようですが、git diff --no-indexはdiff形式の出力のための最も速い方法です。


更新2018-03-25gitリポジトリの中にいて、そのリポジトリ内の追跡されていないファイルを比較したいのでなければ、実際には--no-indexフラグを省略することができます。 manページから:

この形式はファイルシステム上の与えられた2つのパスを比較するためのものです。 Gitによって制御され、少なくとも1つのパスが作業ツリーの外側を指す作業ツリーでコマンドを実行する場合、またはGitによって制御される作業ツリーの外側でコマンドを実行する場合は、--no-indexオプションを省略できます。

21
joelostblom

colordiff:diffの出力を色付きで表示します。

Aboutvimdiff:SSH経由でファイルを比較することができます。例えば:

vimdiff /var/log/secure scp://192.168.1.25/var/log/secure

抽出元: http://www.sysadmit.com/2016/05/linux-diferencias-entre-dos-archivos.html

9
FindlinuxOne

また、忘れないでください mcdiff - GNU Midnight Commanderの内部差分ビューア .

例えば:

mcdiff file1 file2

楽しい!

6
Iurii Golskyi

comm -13を使う(ソートされたファイルが必要です)

$ cat file1
one
two
three

$ cat file2
one
two
three
four

$ comm -13 <(sort file1) <(sort file2)
four
4
Chris Seymour