commコマンドのメモ
目次
commコマンドとは
ソートされた2つのファイルを比較し、それぞれのファイルにしかないもの・両方にあるものを出力することができます。
また、オプションにより、出力するものを変更できます。
ここでは、簡単な例で動作を見ていきたいと思います。
比較ファイルの準備
# 2の倍数のデータ作成
for i in `seq 1 15`; do echo $((i*2)) >> two.txt; done
# 3の倍数のデータ作成
for i in `seq 1 10`; do echo $((i*3)) >> three.txt; done
# ソートしたデータの作成
sort two.txt -o two_sorted.txt
sort three.txt -o three_sorted.txt
commの出力
commコマンドの出力を見ていきます。
3列に分けて下記のようなルールでデータが出力されます。
- 1つ目に指定したファイルのみにあるデータ
- 2つ目に指定したファイルのみにあるデータ
- 両方に存在するデータ
$ comm two_sorted.txt three_sorted.txt
10
12
14
15
16
18
2
20
21
22
24
26
27
28
3
30
4
6
8
9
-1
オプションを指定すると、1列目以外が出力されます。
$ comm -1 two_sorted.txt three_sorted.txt
12
15
18
21
24
27
3
30
6
9
-2
オプションを指定すると、2列目以外が出力されます。
$ comm -2 two_sorted.txt three_sorted.txt
10
12
14
16
18
2
20
22
24
26
28
30
4
6
8
-1 -2
オプションを指定すると、3列目のみが出力されます。
$ comm -1 -2 two_sorted.txt three_sorted.txt
12
18
24
30
6
一致行の抽出作業
2つのファイルから一致した行のみを出力したい場合があると思います。
この場合には、comm -1 -2
が利用できます。
ですが、commコマンドのデメリットとしてソートされたファイルでないといけません。
ソートされていないファイルを対象にする場合は、下記の方法で実現可能です。
$ grep -x -i -f two.txt three.txt
6
12
18
24
30
処理時間については、比較コマンドであるcomm
に優位性がありそうです。
$ time comm -1 -2 three_sorted.txt two_sorted.txt > /dev/null
real 0m0.558s
user 0m0.557s
sys 0m0.001s
$ time grep -i -x -f three_sorted.txt two_sorted.txt > /dev/null
real 0m0.812s
user 0m0.711s
sys 0m0.101s