web-dev-qa-db-ja.com

bashで反結合または逆結合を行う方法

一部のデータ分析ソフトウェアがアンチジョインと呼ぶものを実行したい:別のリストの行と一致する行を1つのリストから削除します。おもちゃのデータと予想される出力を次に示します。

$ echo -e "a\nb\nc\nd" > list1
$ echo -e "c\nd\ne\nf" > list2
$ antijoincommand list1 list2
a
b
1
Josh

joinは入力をソートする必要があるため、joinを使用しません。これは、このような単純なジョブでは不要な複雑化です。代わりにgrepを使用できます:

$ grep -vxFf list2 list1
a
b

またはawk

$ awk 'NR==FNR{++a[$0]} !a[$0]' list2 list1
a
b

ファイルがすでにソートされている場合、join -v 1の代わりにcomm -23を使用できます。

$ comm -23 list1 list2 
a
b
6
terdon

joinユーティリティでこれを行う1つの方法は次のとおりです。

$ join -v 1 list1 list2
a
b
1
Josh