「a.txt」と「b.txt」という2つのファイルがあり、どちらにも単語のリストがあります。今、私は中に余分である言葉をチェックしたい「A.TXT」としていない「B.TXT」。
2つの辞書を比較する必要があるため、効率的なアルゴリズムが必要です。
「a.txt」と「b.txt」という2つのファイルがあり、どちらにも単語のリストがあります。今、私は中に余分である言葉をチェックしたい「A.TXT」としていない「B.TXT」。
2つの辞書を比較する必要があるため、効率的なアルゴリズムが必要です。
回答:
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に固有のエントリーのみをリストします。私は<(...)
構文を使用してファイルをオンザフライでソートします。すでにソートされている場合、これは必要ありません。
comm
ファイル全体をメモリに保存せずに1回の実行でジョブを実行するため、より効率的です。ほとんどの場合、既にソートされている辞書を使用しているため、sort
それらを使用する必要さえありません。grep -f file1 file2
一方、を使用すると、全体file1
がメモリにロードされ、各行file2
がそれらのすべてのエントリと比較されますが、効率ははるかに低くなります。これは主に、ソートされていない小規模の場合に役立ち-f file1
ます。
\n
比較するために含まれることもわかりました。
diff
Linuxのツールを使用して2つのファイルを比較できます。あなたは使用することができます--changedグループ形式をして--unchangedグループ形式のフィルタに必要なデータにオプションを。
以下の3つのオプションを使用して、各オプションに関連するグループを選択できます。
'%<'はFILE1から行を取得します
'%>'はFILE2から行を取得します
''(空の文字列)両方のファイルから行を削除します。
例:diff --changed-group-format = "%<" --unchanged-group-format = "" 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
からの差分出力スタイルgit diff
が必要な場合は、それを--no-index
フラグと一緒に使用して、gitリポジトリにないファイルを比較できます。
git diff --no-index a.txt b.txt
それぞれに約200kのファイル名文字列を含むいくつかのファイルを使用して、私は(組み込み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年3月25日更新--no-index
gitリポジトリ内にいて、そのリポジトリ内の追跡されていないファイルを比較する場合を除き、実際にはフラグを省略できます。マニュアルページから:
このフォームは、ファイルシステム上の指定された2つのパスを比較するためのものです。Gitによって制御されている作業ツリーでコマンドを実行し、少なくとも1つのパスが作業ツリーの外を指している場合、またはGitによって制御されている作業ツリーの外でコマンドを実行する場合は、-no-indexオプションを省略できます。
以下も使用できます。colordiff:diffの出力を色付きで表示します。
vimdiffについて: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
これが私の解決策です:
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
sdiff -s file1 file2
は役に立ちました。
そのためにawkを使用します。テストファイル:
$ cat a.txt
one
two
three
four
four
$ cat b.txt
three
two
one
awk:
$ awk '
NR==FNR { # process b.txt or the first file
seen[$0] # hash words to hash seen
next # next word in b.txt
} # process a.txt or all files after the first
!($0 in seen)' b.txt a.txt # if word is not hashed to seen, output it
重複が出力されます:
four
four
重複を避けるために、a.txtで新しく一致した各単語をseen
ハッシュに追加します。
$ awk '
NR==FNR {
seen[$0]
next
}
!($0 in seen) { # if word is not hashed to seen
seen[$0] # hash unseen a.txt words to seen to avoid duplicates
print # and output it
}' b.txt a.txt
出力:
four
単語リストが次のようにカンマで区切られている場合:
$ cat a.txt
four,four,three,three,two,one
five,six
$ cat b.txt
one,two,three
あなたはいくつかの余分なラップ(for
ループ)をしなければなりません:
awk -F, ' # comma-separated input
NR==FNR {
for(i=1;i<=NF;i++) # loop all comma-separated fields
seen[$i]
next
}
{
for(i=1;i<=NF;i++)
if(!($i in seen)) {
seen[$i] # this time we buffer output (below):
buffer=buffer (buffer==""?"":",") $i
}
if(buffer!="") { # output unempty buffers after each record in a.txt
print buffer
buffer=""
}
}' b.txt a.txt
今回の出力:
four
five,six
diff a.txt b.txt
十分ではありません?