A と B の 2 つのファイルがあります。B にはない A のすべての行を検索したいのですが、標準の Linux ユーティリティを使用して bash でこれを行う最速の方法は何ですか? これが私がこれまでに試したことです:
for line in `cat file1`
do
if [ `grep -c "^$line$" file2` -eq 0]; then
echo $line
fi
done
動作しますが、遅いです。これを行うより速い方法はありますか?
A と B の 2 つのファイルがあります。B にはない A のすべての行を検索したいのですが、標準の Linux ユーティリティを使用して bash でこれを行う最速の方法は何ですか? これが私がこれまでに試したことです:
for line in `cat file1`
do
if [ `grep -c "^$line$" file2` -eq 0]; then
echo $line
fi
done
動作しますが、遅いです。これを行うより速い方法はありますか?
BashFAQ は、標準的に正しい方法であるcomm で正確にこれを行うことを説明しています。
# Subtraction of file1 from file2
# (i.e., only the lines unique to file2)
comm -13 <(sort file1) <(sort file2)
diff は、個々の行ではなくブロックを操作しようとするため、このタスクにはあまり適していません。そのため、使用する必要があるアルゴリズムはより複雑になり、メモリ効率が低下します。
comm は、SUS2 (1997) 以降、Single Unix 仕様の一部となっています。
A
fileではなくfile にある行だけが必要な場合は、ファイルB
を並べ替えて、それらを diff と比較できます。
sort A > A.sorted
sort B > B.sorted
diff -u A.sorted B.sorted | grep '^-'
「diff」プログラムは、ファイル間の違いを調べる標準の UNIX プログラムです。
% cat A
a
b
c
d
% cat B
a
b
e
% diff A B
3,4c3
< c
< d
---
> e
単純な grep とカットを使用すると、B ではなく A の行を選択できます。カットはかなり単純化されており、行内のスペースはそれを台無しにすることに注意してください...しかし、概念はそこにあります。
% diff A B | grep '^<' | cut -f2 -d" "
c
d