地方在住IT系ニート

bkds

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. 1つ目に指定したファイルのみにあるデータ
  2. 2つ目に指定したファイルのみにあるデータ
  3. 両方に存在するデータ
$ 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
にほんブログ村 IT技術ブログ IT技術メモへPVアクセスランキング にほんブログ村