mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Linux - comm コマンドでテキストファイルの差異(行単位)の確認!

[ pc_tips ] [ LMDE2, Linux ]

こんばんは。

Linux でソートされた2つのファイルを行単位に比較するのに diff コマンドを使用することもあると思いますが、今回は comm コマンドについての記録です。

0. 前提条件

  • LMDE2 (Linux Mint Debian Edition 2; 64bit) での作業を想定。(他の Linux ディストリビューションも同様のはず)

1. 準備

比較に使用するサンプルを以下のように作成する。(敢えて、ソートしていない)

test_1.txt
1
2
3
B
A
C
test_2.txt
1
2
3
C
D
A

2. 使用例

出力される結果には3列あり、左から次のようになっている。

  • ファイル1にのみ存在する行
  • ファイル2にのみ存在する行
  • 両方のファイルに存在する行

コマンド実行時に -1, -2, -3 のようにオプションを指定することで、1, 2, 3列目の出力が抑止される。

2-1. ソートされているか明示的にチェックしない例(全列出力)

(元ファイルをソートしないまま)

1
2
3
4
5
6
$ comm --nocheck-order test-1.txt test-2.txt
B
A
                C
        D
        A
  • --nocheck-order は、入力が正しくソートされているかどうかをチェックしないオプション
  • ソートされてないと判定されてもエラーにせず、最後まで実行される。

2-2. ソートされているか明示的にチェックする例(全列出力)

(元ファイルをソートしないまま)

1
2
3
$ comm --check-order test-1.txt test-2.txt
B
comm: ファイル 1 がソートされていません
  • --check-order は、入力が正しくソートされているかどうかをチェックするオプション(全ての行の組み合わせが一致していても)
  • ソートされてないと判定された時点で終了する。
  • --nocheck-order--check-order も指定しない場合は、ソートされてないと判定されても最後まで実行される。

2-3. ソートした上で明示的にチェックする例(全列出力)

1
2
3
4
5
$ comm --check-order <(sort test-1.txt) <(sort test-2.txt)
                A
B
                C
        D

2-4. ソートした上で明示的にチェックする例(1列のみ出力)

ファイル1にのみ存在する行を確認する場合は、

1
2
$ comm -23 --check-order <(sort test-1.txt) <(sort test-2.txt)
B

ファイル2にのみ存在する行を確認する場合は、

1
2
$ comm -13 --check-order <(sort test-1.txt) <(sort test-2.txt)
D

2-5. その他

  • 出力結果を区切る文字列を --output-delimiter=STR オプションで指定することもできる。
    例えば、 --output-delimiter=, とすれば、列がカンマで区切られる。
  • 詳細な使用方法は comm --helpman comm を参照のこと。

3. 参考サイト


以上。

Comments