覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

bashのProcess Substitutionを利用したdiff

bashに Process Substitution(プロセス置換) という機能があるのを全然知りませんでした。

詳しい説明は別の方の記事を参照ください。。。

たとえば、この機能をdiffコマンドと組み合わせて使ったりすると効果的なようです。

diffは、入力対象としてファイルのみを対象としているため、通常のパイプで処理済みテキストを渡すことがでないのですが、
Process Substitutionを利用して、コマンドの処理結果同士を diff で比較することが可能です。

呼び出し方法は以下のようになります。

diff <(なんかのコマンド1) <(なんかのコマンド2)


例えば以下の2つのファイルがあったとして、重複行は1行にまとめた上で、データに差分があるかないかをチェックしたいとします。
33333 という行が sample1.txt にだけ存在するという差分があります)


■sample1.txt

00000
11111
11111
12345
12346
11111
22222
33333
44444
55555
66666
77777
88888
99999
00000
12345
12345
11111
99999
00000
11111
22222
33333
44444
55555
66666
77777
88888
99999
00000
12345
12345
12346
11111
23456


■sample2.txt

00000
11111
11111
12345
11111
22222
44444
55555
66666
77777
88888
99999
00000
12345
12345
11111
99999
00000
11111
22222
44444
77777
88888
99999
00000
12345
12346
11111
23456


通常であれば以下のような処理手順になると思います。

$sort sample1.txt | uniq > sample1.txt.tmp
$sort sample2.txt | uniq > sample2.txt.tmp
$diff sample1.txt.tmp sample2.txt.tmp
7d6
< 33333

一度、sortuniqコマンドを利用して中間ファイルを作り出して、その中間ファイル同士をdiffで比較します。


これを、Process Substitutionを利用してやると以下のようになります。

$diff <(sort sample1.txt | uniq) <(sort sample2.txt | uniq)
7d6
< 33333

なんということでしょう、中間ファイルが不要となっております!。


今後、Process Substitution が利用できる場面では、どんどん使っていきたいです。