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
一度、sort
とuniq
コマンドを利用して中間ファイルを作り出して、その中間ファイル同士をdiff
で比較します。
これを、Process Substitution
を利用してやると以下のようになります。
$diff <(sort sample1.txt | uniq) <(sort sample2.txt | uniq) 7d6 < 33333
なんということでしょう、中間ファイルが不要となっております!。
今後、Process Substitution
が利用できる場面では、どんどん使っていきたいです。