質問
- awkとsedの違いは何ですか?
- SEDおよびAWKツールの最良のユースケースはどのようなアプリケーションですか?
解決
sed
ストリームエディタです。文字のストリームを行ごとに処理します。これには、goto スタイルのループと単純な条件 (パターン マッチングとアドレス マッチングに加えて) が含まれる原始的なプログラミング言語があります。基本的に「変数」は 2 つだけです。パターンスペースとホールドスペース。スクリプトは読みにくい場合があります。数学的演算は、ひいき目に見ても非常に扱いにくいものです。
さまざまなバージョンがあります sed
コマンドラインオプションと言語機能のサポートレベルが異なります。
awk
行ごとに区切られたフィールドを対象としています。より堅牢なプログラミング構造を備えています。 if
/else
, while
, do
/while
そして for
(C スタイルと配列の反復)。変数と 1 次元の連想配列と (IMO) 難解な多次元配列が完全にサポートされています。数学的演算は C の演算に似ています。それは持っています printf
そして機能。「AWK」の「K」は「」の頭文字です。K「ernighan」は、書籍「C プログラミング言語」の「カーニハンとリッチー」で有名になったものです (忘れないでください) あほーと 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
を使用して、テキストエディターで手動で行うタスクを自動化します。それがストリーム editor と呼ばれる理由です。 (同じコマンドを使用してvimのテキストを編集できます)。テキストの分析、フィールドのカウント、合計の計算、構造の抽出および再編成などを行う場合は、 awk
を使用します。
また、 grep
を忘れないでください。テキスト(ファイル)内の何かを検索/抽出する場合のみ grep
を使用します