sedとawkは、通常のbashを使用するbashスクリプトで簡単に実行できない機能を提供しますか? [閉鎖]

sedとawkは、通常のbashを使用するbashスクリプトで簡単に実行できない機能を提供しますか? [閉鎖]

私はsedとawkを学ぶ前にbashを最初に学びました。人々はsed、awk、時にはgrepを使って多くのことをするのを見ましたが、bashロジックでしか実行できないようです。私は考えています既にbashスクリプターである人が学ぶのに役立つsedとawkのユースケースは何ですか?sedとawkを完全に理解していないと、それを決定するのは難しいです。

ベストアンサー1

すでに手と膝で歯車する方法を知っていますが、自動車の運転方法を学ぶことが何を意味するのかと尋ねるのと似ています。はい、bashは基本的なテキスト操作や単純な数学に乱用される可能性がありますが、最も遅いツールであり、構文が複雑でエラーが発生しやすいです。また、bashを含むシェルは浮動小数点操作を実行できないため、シェルのみを使用して実行できる操作は大幅に制限されます。

これらの理由の1つで十分ですが、次は非常に簡単な例です。 1から100,000までの数字がランダムな順序で混在したファイルを取得します。

seq 100000 | shuf > file

それでは、すべての奇数を選択してみましょう。 Bashでは、次のことができます。

$ time while read num; do [[ $num =~ [24680]$ ]] || echo $num; done < file > newfile

real    0m3.481s
user    0m2.648s
sys     0m0.801s

マイコンピュータでは約3秒かかります。同じことをしましたが、数字が1から1,000,000の間の場合はどうなりますか?

seq 1000000 | shuf > file

そして:

$ time while read num; do [[ $num =~ [24680]$ ]] || echo $num; done < file > newfile

real    0m32.483s
user    0m25.035s
sys     0m7.343s

すでに30秒以上でした!それでは、awk同じ内容を正しい数学で比較してみましょう。

$ time awk '$1 % 2 !=0' file > newfile 

real    0m0.344s
user    0m0.340s
sys     0m0.003s

1秒も残りませんでした。同じテキストマッチング方法を使用するsedはどうですか?

$ time sed -n '/[13579]$/p' file > newfile 

real    0m0.280s
user    0m0.273s
sys     0m0.007s

1秒も過ぎず、こういうことが再び起こりました。では10,000,000に増やしたらどうでしょうか?

$ seq 1000000 | shuf > file
$ time awk '$1 % 2 !=0' file > newfile 

real    0m4.081s
user    0m3.896s
sys     0m0.090s

$ time sed -n '/[13579]$/p' file > newfile 

real    0m2.898s
user    0m2.683s
sys     0m0.111s

$ time while read num; do [[ $num =~ [24680]$ ]] || echo $num; done < file > newfile1

real    5m42.445s
user    4m25.687s
sys     1m15.241s

ご覧のとおり、シェルソリューションはビシェルソリューションよりはるかに遅いです。そして、千万行のファイルは特に珍しいものではありません。これは76Mテキストファイルです。さらに、両方のビシェルソリューションは、文字の長さの点ではるかに短く、構文を理解するとはるかに簡単です。

つまり、「あなたが持っているのがハンマーだけなら、すべてが釘のように見える」という事例です。はい、bashはsedorなどのツールを使用して実行できるいくつかの操作を実行できますが、はるかにawk遅く、正しく実行されません。

おすすめ記事