AWK Cのようなワードプロセッサ

この記事では、 AWK言語の主な機能を例とともに紹介します。 その使用の問題も提起されます。 この出版物は、ガイダンスのみを目的としています。 さあ、行こう...

ちょっとした歴史


AWKの最初のバージョンは、1977年にベル研究所によって作成されました。 AWKという名前は、クリエイターであるAlfred A ho、Peter W einberger、およびBrian K ernighanのイニシャルを意味します。 この言語では、C、SNOBOL4、およびBourne Shellの影響が追跡されていることに注意してください。 構造化テキストのレコード内の文字フィールドと数字フィールドを処理するために設計されています。

AWKで書かれたプログラムの構造


AWKプログラムは通常、BEGINブロック、Bodyブロック、およびENDブロックであるいくつかのキーブロックで構成されます。 すべてのブロックが存在する必要はありません。 そして今、それらのそれぞれについてもう少し。

開始ブロック

構文:
BEGIN {awk-command}
このブロックは、プログラムの期間全体で一度だけ実行されます。 主な目的は、変数の初期化です。 前述のように、このブロックがないことは許可されています。

ボディブロック

構文:
/パターン/ {action}
このブロックは、処理中のファイルの各レコード(行)に対してawkインタープリターによって1回実行されます。 ファイルに100レコード(行)が含まれている場合、このブロックは各レコード(行)ごとに100回実行されます。 /パターン/はオプションです。 / pattern /が指定されていない場合、awkは入力ファイルのすべてのエントリを処理します。 / pattern /が指定されている場合、指定されたテンプレートに一致する入力ファイルのエントリのみが処理に転送されます。 {action}は、パターンに一致する各行に適用されるコマンドです。 {action}の例はprintです。

エンドブロック

構文:
END {awk-command}
このブロックは、本体ブロックの後の最後で一度だけ実行されます。 ENDブロックは通常、レポートを生成するために使用されます。

例を挙げましょう


employee.txtawkの非常に構造化されたファイルとし、その内容を以下に示します。
Jane Li、ITマネージャー、3000
ケイトムーン、ナース、2000
スティーブ・ジーマ、作家、4250
アンドリュー・スカイ、警官、4000

ところで、このファイルの情報が構造化されているという事実に注目します。すべてのレコードについて、最初のフィールドは姓の名前、2番目は位置、3番目は給与です。

開始するには、Linuxコンソールで簡単なコマンドを実行して、すべてのコンテンツを表示します。

$ awk {print} employee.txt

同じテンプレート(/ pattern /)が指定されていないため、インタープリターはemployee.txtファイルの内容全体を表示しました。
そして、コンソールに3000(cu)以上の給与を受け取る従業員に関する情報を表示します。

$ awk 'BEGIN {FS = "、"} {if($ 3> = 3000)print $ 0}' employee.txt

FSfrom file separator )は、デフォルトのスペースをフィールドセパレーターとして保存する組み込み変数です。 この例では、FS変数の「、」値により、各レコードが3つのフィールドに分割されます。 フィールドへのアクセスは、変数$ 1、$ 2、$ 3を使用して実行されます。 ところで、$ 0はすべてのフィールドを持つレコード全体を意味します。
次の例では、給与に関する会社の直接費用を計算します。

$ awk 'BEGIN {FS = "、"; 合計= 0} {合計+ = $ 3;印刷} END {printf( ''合計= $%d \ n ''、合計)} 'employee.txt

ちなみに、引数なしの印刷は、レコード全体を印刷することを意味します。 0ドル。 AWKは、Cに比べて少し特別な言語です。 変数の宣言と初期化を行う義務は一切ありません。 つまり 次の例は、後者に関して同一です。

$ awk 'BEGIN {FS = "、"; 合計} {合計+ = $ 3;印刷} END {printf( ''合計= $%d \ n ''、合計)} 'employee.txt
$ awk 'BEGIN {FS = "、"} {total + = $ 3; print} END {printf(' 'total = $%d \ n' '、total)}' employee.txt

サイクル



サイクルに関しては、すべてがここで非常に明確です。 AWKは、while、do-while、forループをサポートしています。 構文は伝統的です。 例:

$ awk 'BEGIN {while(i <17){str = str "#"; i ++} print str}'

str = str "#"は連結にすぎません。
ところで、 awkは breakexitcontinueの目的を忘れていません。
時には、期待した結果を得るために多くのコード行を書く必要があります。 コンソールは、同じコードのn行を何十行も書くのに便利な場所ではなくなることは明らかです。 この問題は簡単に回避できます。 AWKの十分な構造部分で、ファイルに書き込み、必要に応じて参照します。 最後の例は次のように実行できます。
script.awkファイルに次を保存します。

BEGIN {while(i <17){str = str "#"; i ++} print str}

最後の例を実行するには:

$ awk -f script.awk

連想配列

AWK連想配列のトピックは、次の投稿の良いトピックです。 したがって、今のところ、このトピックに強く署名するのではなく、この機能を示す簡単な例に限定します。

$ awk 'BEGIN {arr [1] = "a"; arr [2] = 2; arr ["n"] = 777; for(i in arr)print arr [i]} '

おわりに
この記事では、強力なAWKワードプロセッサの表面機能を紹介しようとしました。 文字列の操作や連想配列の操作などの重要な側面は、さらに注目に値するものであり、以下の出版物で取り上げられています。 したがって、私は意図的にそれらを後で残しました。 私の最初の記事が、悪名高いAWKの機能の一部を読んだすべての人にずっと近づいたことを願っています。

文学


1. Sed&Awk 101ハック
2.アルフレッドV.アホ、ブライアンW.カーニハン、ピーターJ.ワインバーガーによるAwkプログラミング言語

Source: https://habr.com/ru/post/J150185/


All Articles