8

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

動作しますが、遅いです。これを行うより速い方法はありますか?

4

3 に答える 3

22

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 仕様の一部となっています。

于 2012-05-07T21:43:37.877 に答える
1

Afileではなくfile にある行だけが必要な場合は、ファイルBを並べ替えて、それらを diff と比較できます。

sort A > A.sorted
sort B > B.sorted
diff -u A.sorted B.sorted | grep '^-'
于 2012-05-07T21:43:34.700 に答える
0

「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
于 2012-05-07T21:42:42.627 に答える