"a.txt"と "b.txt"という2つのファイルがあります。 - )両方とも単語のリストを持っています。今、私はどの単語が "a.txt"で余分であり、 "b.txtではないかを確認したいです。 "。
2つの辞書を比較する必要があるので、効率的なアルゴリズムが必要です。
これが私の解決策です。
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
もしvimがインストールされているのなら、これを試してください。
vimdiff file1 file2
または
vim -d file1 file2
あなたはそれが素晴らしいと思うでしょう。
それらを並べ替えてcomm
を使う:
comm -23 <(sort a.txt) <(sort b.txt)
comm
は入力ファイルを(ソートして)比較し、デフォルトで3つの列を出力します。aに固有の行、bに固有の行、および両方に存在する行です。 -1
、-2
、および/または-3
を指定することで、対応する出力を抑制することができます。したがってcomm -23 a b
はaに固有のエントリだけをリストします。私は<(...)
構文を使ってファイルをその場でソートします。すでにソートされているのであれば、これは必要ありません。
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
sdiff
(man sdiff
)を試してください
sdiff -s file1 file2
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オプションを省略できます。
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
comm -13
を使う(ソートされたファイルが必要です):
$ cat file1
one
two
three
$ cat file2
one
two
three
four
$ comm -13 <(sort file1) <(sort file2)
four