Linux/Macでcommコマンドを使って片方だけ・両方に存在する行を簡単に抽出する
Pocket

なんとなしにネットサーフィンしていたところ、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
Sponsored Links

このとき、「-○」で特定の列を除外して出力させることができるので、片方のファイルにしかない行や共通行だけを抽出することもできる。

[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=’~’」で設定が可能となっている。

Pocket

Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。