(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Linux/bash】順序を保ったまま同じ文字列の行があるかないかでdiffを取る

スポンサーリンク

やりたいこと

以下のファイルAと

apple
strawberry
orange
cherry
grape

以下のファイルBがあった場合に

orange
pineapple
banana
strawberry

ファイルAの中でファイルBの中に存在しないものを差分として以下のように出力する。

apple
cherry
grape
環境情報
$ grep --version
grep (GNU grep) 3.7

やり方

grepコマンドにおける-xオプション(match only whole lines)を利用する。

具体的には以下。

$ grep -x -v -f b.txt a.txt
apple
cherry
grape

-vオプションを外せば逆に重なっている部分のみが表示される。

$ grep -x -f b.txt a.txt
strawberry
orange

以下、補足です。

補足

二つのファイルの差分はdiffコマンドで行えますが、行数が違うことでstrawberryは別モノとして認識されています。

$ diff a.txt b.txt
1,2d0
< apple
< strawberry
4,5c2,4
< cherry
< grape
---
> pineapple
> banana
> strawberry

これを防ぐためにはsortコマンドで順序を揃えるという策はありますが、ファイルの行順序を保持したい場合は利用できないので今回は同解決策を利用しました。

以上です。