uniq の -d と -u

ファイル a, b はそれぞれ重複する行を含んでいないと仮定する。

# a, b に共通な行を抜き出す
cat a b | sort | uniq -d > common
#  b にだけ含まれる行を抜き出す
cat a b | sort | uniq > all
cat a all | sort | uniq -u >only_in_b

"Shell Programming Examples" by Bruce Blinn の DirCmp を見ていて発見。
存在意義がわからなかったオプションの使い道を見つけたときは妙に感動する。
Unix コマンドの神秘。

[追記:2007-01-25]

"Shell Programming Examples" by Bruce Blinn
ftp://ftp.prenhall.com/pub/ptr/hewlett_packard_professional_books.w-064/blinn/port.sh/shbook.tar.Z


コメントへのレス。

c-yan 『uniq -c でカウントを出して、処理をするほうが汎用的だなあと思う私は駄目でしょうか(^^;;;』

a, b, がそれぞれ重複行を含まないなら、

cat a a b | sort |uniq -c

とすれば、重複数をみて 1=b のみ 2=a のみ 3=共通 とわかりますね。


http://d.hatena.ne.jp/lurker/20070124/1169646588

fgrep -xf ./fileA.txt ./fileB.txt
fgrep -v -xf ./fileA.txt ./fileB.txt

前者は昨年 12/4 に知りました。
http://d.hatena.ne.jp/parasporospa/20061204/p2
昔の lurker さんの記事にも書いてあったしね。
http://d.hatena.ne.jp/lurker/20060509
この方法では「それぞれ重複行を含まない」という制限はなくてもいいんじゃないでしょうか?
しかしそうなると uniq -(d|u) はやはり存在意義がないのですかね。
パフォーマンス面でも劣りそうだし。