パイプを使用すると違いがありますか?

パイプを使用すると違いがありますか?

Ubuntu 12.04を使用してください。

パイプ使用(5回):

$ time echo XYZ | sed 's/X/A/g' | sed 's/Y/B/g' | sed 's/Z/C/g'
ABC

real    0m0.005s
user    0m0.000s
sys 0m0.000s
$ time echo XYZ | sed 's/X/A/g' | sed 's/Y/B/g' | sed 's/Z/C/g'
ABC

real    0m0.004s
user    0m0.000s
sys 0m0.000s
$ time echo XYZ | sed 's/X/A/g' | sed 's/Y/B/g' | sed 's/Z/C/g'
ABC

real    0m0.004s
user    0m0.004s
sys 0m0.000s
$ time echo XYZ | sed 's/X/A/g' | sed 's/Y/B/g' | sed 's/Z/C/g'
ABC

real    0m0.005s
user    0m0.000s
sys 0m0.000s
$ time echo XYZ | sed 's/X/A/g' | sed 's/Y/B/g' | sed 's/Z/C/g'
ABC

real    0m0.005s
user    0m0.004s
sys 0m0.000s

パイプがない場合(5回):

$ time echo XYZ | sed 's/X/A/g; s/Y/B/g; s/Z/C/g'
ABC

real    0m0.003s
user    0m0.000s
sys 0m0.004s
$ time echo XYZ | sed 's/X/A/g; s/Y/B/g; s/Z/C/g'
ABC

real    0m0.003s
user    0m0.000s
sys 0m0.000s
$ time echo XYZ | sed 's/X/A/g; s/Y/B/g; s/Z/C/g'
ABC

real    0m0.003s
user    0m0.000s
sys 0m0.000s
$ time echo XYZ | sed 's/X/A/g; s/Y/B/g; s/Z/C/g'
ABC

real    0m0.003s
user    0m0.004s
sys 0m0.000s
$ time echo XYZ | sed 's/X/A/g; s/Y/B/g; s/Z/C/g'
ABC

real    0m0.003s
user    0m0.000s
sys 0m0.000s
$ 

パイプを使用しない方が速いことは明らかです。したがって、スクリプトを最適化するために使用できます。

$ echo ABC | sed 's/A/X/g; s/X/Y/g'
YBC
$ 

私の質問:sedをマージすると、常に同じ出力が生成されますか?

ベストアンサー1

短い答えは次のとおりです。管路別の置換を実行するには、シェルを数回分岐する必要があります。

一方、sedさまざまな代替コマンドを含む式では、シェルは一度だけフォークできます。

したがって、次のように単一の式にさまざまなコマンドを含める方が効率的です。

sed 's/X/A/g; s/Y/B/g; s/Z/C/g'

2番目の部分に答えるために、上記は次のとおりです。ゆっくり変形:

sed 's/X/A/g' | sed 's/Y/B/g' | sed 's/Z/C/g'

おすすめ記事