2012-05-07 8 views
8

私は2つのファイルAとBを持っています。私はBにないAのすべての行を探したいのですが、bash /標準のLinuxユーティリティを使ってこれを行う最も速い方法は何ですか?これまでに試したことは次のとおりです。どのように2つのファイルの設定の違いを見つけるには?

for line in `cat file1` 
do 
    if [ `grep -c "^$line$" file2` -eq 0]; then 
    echo $line 
    fi 
done 

動作は遅くなっています。これを行うより速い方法がありますか?

+0

コードを表示したり、試したことを説明したりできますか?あなたの質問は、あなたが私たちにあなたのためにすべての仕事をさせてくれるように思えます。多くの場合、コードを表示すると、より多くの回答を促し、より良い結果を得るのに役立ちます。 – jmort253

+0

また、「最速」で期待するものを定義する必要があります。それは処理時間、またはコードの作成に費やされた時間です。第二に、私は 'diff A B | grep '^ - ' ' – tonio

+0

@ jmort253、ありがとう、私は詳細を追加する質問を編集しました – spinlok

答えて

20

The BashFAQdescribes doing exactly this with comm、。

# Subtraction of file1 from file2 
# (i.e., only the lines unique to file2) 
comm -13 <(sort file1) <(sort file2) 

diffは個々の行ではなくブロックで操作しようとするため、このタスクにはあまり適していません。そのため、使用するアルゴリズムはより複雑でメモリ効率は低くなります。

通信はSUS2(1997)以来part of the Single Unix Specificationです。

+0

これは私が探していたものです!ありがとう! – spinlok

+0

これは便利なプログラムです。私は前にそれを見たことがない。私は、sysadminとして私の過去の人生が見逃していたシェルアプリケーションの他の小さな宝石が何か不思議です。 –

1

'diff'プログラムは、ファイル間の相違点を調べる標準的なunixプログラムです。単純なgrepで

% cat A 
a 
b 
c 
d 
% cat B 
a 
b 
e 
% diff A B 
3,4c3 
< c 
< d 
--- 
> e 

、もう1つはAではなくBの行を選択することができますカットカットはかなり単純化され、行にスペースがそれをオフに投げることに注意してください...しかし概念があります。

% diff A B | grep '^<' | cut -f2 -d" " 
c 
d 
2

あなたは、単にファイルAにある行をしたいが、Bに、あなたはファイルを並べ替えることができ、および差分とそれらを比較しない場合。正準正しい方法である

sort A > A.sorted 
sort B > B.sorted 
diff -u A.sorted B.sorted | grep '^-' 
+4

一時ファイルは必要ありません。 'diff <(ソートA)<(ソートB)| grep '^ - ' ' – jordanm

+0

はい、それはこの方法でもさらに明確です – tonio

関連する問題