AWKコマンドとスクリプトを書く方法

コマンド、構文、および例

awkコマンドは、テキストファイル、特に行(行)と列で構成されたデータファイルを処理または分析する強力な方法です。

シンプルなawkコマンドは、 コマンドラインから実行できます。 より複雑なタスクはawkプログラム(いわゆるawkスクリプト)としてファイルに書き込まれるべきです。

awkコマンドの基本形式は次のようになります。

awk 'パターン{アクション}'入力ファイル>出力ファイル

これは、入力ファイルの各行を取ります。 行にパターンが含まれている場合は、その行にアクションを適用し、結果の行を出力ファイルに書き込みます。 パターンを省略すると、アクションはすべての行に適用されます。 例えば:

awk '{print $ 5}' table1.txt> output1.txt

このステートメントは、各行の5番目の列の要素を取り出し、出力ファイル "output.txt"に1行として書き込みます。 変数 '$ 4'は2番目の列を参照します。 同様に、$ 1、$ 2、$ 3などで1番目、2番目、3番目の列にアクセスすることができます。デフォルトでは、列は空白またはタブ(いわゆる空白)で区切られています。 したがって、入力ファイル "table1.txt"に次の行が含まれているとします。

1、ジャスティンティンバーレイク、タイトル545、価格$ 7.30 2、テイラースウィフト、タイトル723、価格$ 7.90 3、ミックジャガー、タイトル610、価格$ 7.90 4、レディガガ、タイトル118、価格$ 7.30 5、ジョニーキャッシュ、タイトル482、価格$ 6.50 6、エルヴィス・プレスリー、タイトル335、価格$ 7.30 7、ジョン・レノン、タイトル271、価格$ 7.90 8、マイケル・ジャクソン、タイトル373、価格$ 5.50

コマンドは次の行を出力ファイル "output1.txt"に書き込みます。

545、723、610、118、482、335、271、373、

列の区切り文字がスペースやタブ以外のもの(カンマなど)である場合は、awkステートメントで次のように指定できます。

awk -F、 '{print $ 3}' table1.txt> output1.txt

これは、列がカンマで区切られていると見なされる場合、各行の3列目の要素を選択します。 したがって、この場合の出力は次のようになります。

タイトル545タイトル723タイトル610タイトル118タイトル482タイトル335タイトル271タイトル373

中括弧( '{'、 '}')内のステートメントのリストはブロックと呼ばれます。 条件式をブロックの前に置くと、ブロック内のステートメントは条件がtrueの場合にのみ実行されます。

awk '$ 7 == "\ $ 7.30" {print $ 3} "table1.txt

この場合、条件は$ 7 == "\ $ 7.30"であり、これは列7の要素が$ 7.30に等しいことを意味します。 ドル記号の前のバックスラッシュは、システムが$ 7を変数として解釈するのを防ぐために使用され、ドル記号をそのまま使用します。

したがって、このawkステートメントは、各行の3列目の要素を、7列目に「$ 7.30」を持つように出力します。

条件として正規表現を使用することもできます。 例えば:

awk '/ 30 / {print $ 3}' table1.txt

2つのスラッシュ( '/')間の文字列は正規表現です。 この場合、文字列 "30"だけです。 つまり、行に文字列 "30"が含まれている場合、システムはその行の3番目の列に要素を出力します。 上記の例の出力は次のようになります。

ティンバーレイク、ガガ、プレスリー、

テーブル要素が数値の場合、awkは次の例のように計算を実行できます。

awk '{print($ 2 * $ 3)+ $ 7}'

現在の行($ 1、$ 2など)の要素にアクセスする変数に加えて、完全な行(行)を参照する変数$ 0と、フィールドの数に保持される変数NFがあります。

次の例のように、新しい変数を定義することもできます。

awk '{sum = 0; for(col = 1; col <= NF; col ++)sum + = $ col; プリント合計。 } '

これは、各行のすべての要素の合計を計算して出力します。

awkの文は、 sedコマンドと組み合わされることが多いです。