sed
はストリームエディタです。 1行ごとに文字のストリームを処理します。これは、(パターンマッチングとアドレスマッチングに加えて)gotoスタイルのループと単純な条件文を含む原始的なプログラミング言語を持っています。基本的に2つの「変数」だけがあります:パターンスペースとホールドスペース。スクリプトの読みやすさは難しい場合があります。数学的な操作は、せいぜい非常に扱いにくいものです。
sed
にはさまざまなバージョンがあり、コマンドラインオプションと言語機能のサポートレベルが異なります。
awk
は、1行ごとに区切られたフィールドを対象としています。 if
/else
、while
、do
/while
、およびfor
(Cスタイルおよび配列反復)を含む、はるかに堅牢なプログラミング構成体です。変数と1次元連想配列と(IMO)kludgey多次元配列を完全にサポートしています。数学的な操作はCのものに似ています。それはprintf
と関数を持っています。 "AWK"の "K"は、 "C Programming Language"という本の "Kernighan and Ritchie"のように、 "Kernighan"を表します。 (AhoとWを忘れないでください) 。 awk
を使って学術的盗用の探知機を書くこともできるでしょう。
GNU awk
(gawk
)には、最新バージョンの真の多次元配列を含む、数多くの拡張機能があります。 awk
とmawk
を含むnawk
の他のバリエーションがあります。
どちらのプログラムもテキストの選択と処理に正規表現を使用します。
私はテキストにパターンがあるところではsed
を使う傾向があります。たとえば、「マイナス記号とそれに続く一連の数字」(例:「-231.45」)の形式のテキストのすべての負数を、「会計士の括弧」形式(例:(231.45))に置き換えることができます。 )これを使用する(改善の余地があります):
sed 's/-\([0-9.]\+\)/(\1)/g' inputfile
テキストが行と列のように見える場合、またはawk
が「レコード」と「フィールド」を指す場合は、awk
を使用します。もし私が上と同じような操作をするつもりなら、単純なコンマ区切りファイルの3番目のフィールドでのみ、私は以下のようなことをするかもしれません:
awk -F, 'BEGIN {OFS = ","} {gsub("-([0-9.]+)", "(" substr($3, 2) ")", $3); print}' inputfile
もちろん、これらはごく単純な例であり、それぞれが提供しなければならない機能の全範囲を示すものではありません。
1)awkとsedの違いは何ですか?
どちらもテキストを変換するツールです。しかしawkは単にテキストを操作する以外にも多くのことができる。そのプログラミング言語それ自体は、配列、ループ、if/elseフロー制御など、プログラミングで学ぶことのほとんどを備えています。sedでも「プログラム」できますが、その中に書かれたコードを維持したくはありません。
2)sedおよびawkツールの最適なユースケースはどのようなアプリケーションですか?
結論:非常に単純なテキスト解析にはsedを使用してください。それ以上のものは何でも、awkが優れています。実際には、sedを完全に捨ててawkを使用することができます。それらの機能は重なっていて、awkはもっと多くのことができるので、単にawkを使ってください。あなたもあなたの学習曲線を減らすでしょう。
どちらのツールもテキストを操作するためのものであり、両方のツールを使用できるタスクがあります。
私にとっては、それらを分離するための規則は以下のとおりです。テキストエディタで手動で行わなければならない作業を自動化するためにsed
を使用します。だからこそ、それはstreameditorと呼ばれています。 (あなたはvimでテキストを編集するために同じコマンドを使うことができる)。テキストの分析、フィールドのカウント、合計の計算、構造の抽出と再編成などを行いたい場合は、awk
を使用してください。
grep
も忘れてはいけません。テキスト(ファイル)内の何かを検索/抽出するだけの場合はgrep
を使用してください。