なんとなしにネットサーフィンしていたところ、commコマンドというコマンドがあることを知ったのでどういったコマンドなのか調べてみた。
このコマンド、簡単に説明すると2つのファイルを比較して、片方だけにある行を1or2列目に、両方にある行を3列目に分割して出力してくれる、というコマンドだ。
最初から入っているので、そのまま使える。
なお、比較の際はファイルは文字列ソート(数字ソートだとダメらしい)されている必要があるらしい。
サンプルファイルを元に、実際にコマンドを実行した結果が以下。
1個目のファイルだけに存在する行は1列目、2個目のファイルのは2列目、共通行は3列目に出力される。
※空白行があると面倒なので削除している
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test123_2
1111
2222
3333
33333
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test123_3
1111
222
3333
33333
[root@BS-PUB-CENT7-01 ~]# diff <(sort /tmp/test123_2 | sed '/^$/d') <(sort /tmp/test123_3 | sed '/^$/d')
2c2
< 2222
---
> 222
[root@BS-PUB-CENT7-01 ~]# comm <(sort /tmp/test123_2 | sed '/^$/d') <(sort /tmp/test123_3 | sed '/^$/d')
1111
222
2222
3333
33333
このとき、「-○」で特定の列を除外して出力させることができるので、片方のファイルにしかない行や共通行だけを抽出することもできる。
[root@BS-PUB-CENT7-01 ~]# # 共通行だけ抽出
[root@BS-PUB-CENT7-01 ~]# comm -12 <(sort /tmp/test123_2 | sed '/^$/d') <(sort /tmp/test123_3 | sed '/^$/d')
1111
3333
33333
[root@BS-PUB-CENT7-01 ~]# # 1個目のファイルにだけ存在する行を抽出
[root@BS-PUB-CENT7-01 ~]# comm -23 <(sort /tmp/test123_2 | sed '/^$/d') <(sort /tmp/test123_3 | sed '/^$/d')
2222
[root@BS-PUB-CENT7-01 ~]# # 2個目のファイルにだけ存在する行を抽出
[root@BS-PUB-CENT7-01 ~]# comm -13 <(sort /tmp/test123_2 | sed '/^$/d') <(sort /tmp/test123_3 | sed '/^$/d')
222
そのほか、grepのように使うこともできるようだ。
fgrepと同じような動きなのだけど、速度的にはこっちのほうが早いらしい。なんでだろ。
[root@BS-PUB-CENT7-01 ~]# sort /tmp/test123_2 | sed '/^$/d'
1111
2222
3333
33333
[root@BS-PUB-CENT7-01 ~]# comm -12 <(sort /tmp/test123_2 | sed '/^$/d') <(echo 1111)
1111
なお、デフォルトだとデリミタはタブになっているが、「--output-delimiter='~'」で設定が可能となっている。