ブログ

ソートされているファイルの各行を比較する方法

at_shiita.ishigaki
2021年10月15日 8時47分

ソートされているファイルの各行を比較するにはcommコマンドを使用します。
※ここでは例として、a.txtとb.txtを比較します。

[armadillo ~]# cat a.txt
abc
defg
hij
[armadillo ~]# cat b.txt
abc
defg
hijk
lmn
[armadillo ~]# comm a.txt b.txt
                abc
                defg
hij
        hijk
        lmn

commコマンドの出力は、1列目に1つ目のファイルのみに含まれている行、2列目に2つ目のファイルのみに含まれている行、3列目にどちらのファイルにも含まれている行となります。

出力される区切り文字を変更するには--output-delimiterオプションを使用します。
※ここでは例として、区切り文字を","にします。

[armadillo ~]# comm a.txt b.txt --output-delimiter=,
,,abc
,,defg
hij
,hijk
,lmn

以下のようにファイルがソートされていない場合、エラーが表示されることがあります。
※ここではb.txtの1行目を4行目に移動させています。

[armadillo ~]# cat b.txt
defg
hijk
lmn
abc
[armadillo ~]# comm a.txt b.txt
abc
                defg
hij
        hijk
        lmn
comm: file 2 is not in sorted order
        abc

この場合、事前にソートすることでエラーになりません。

[armadillo ~]#  comm a.txt <(sort b.txt)
                abc
                defg
        hij
hijk
lmn