AWK

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ
AWK
The-AWK-Programming-Language.svg
Awk-example-usage-gimp.gif
パラダイムスクリプティング手続き型データ駆動型[1]
によって設計されたアルフレッド・エイホピーター・ワインバーガーブライアン・カーニハン
初登場1977 ; 45年前 (1977
安定リリース
IEEE Std 1003.1-2008(POSIX)/ 1985
規律の入力無し; 文字列、整数、浮動小数点数を処理できます。正規表現
OSクロスプラットフォーム
主な実装
awk、GNU Awk、mawk、nawk、MKS AWK、Thompson AWK(コンパイラー)、Awka(コンパイラー)
方言
古いawkoawk1977、新しいawk nawk 1985、GNU Awk gawk
に影響を受けた
CsedSNOBOL [2] [3]
影響を受ける
TclAMPLPerlKorn Shell( ksh93 dtkshtksh Lua

AWKawk[4]は、テキスト処理用に設計されたドメイン固有言語であり、通常、データ抽出およびレポートツールとして使用されます。sedgrepと同様に、これはフィルター[4]であり、ほとんどのUnixライクなオペレーティングシステムの標準機能です

AWK言語は、データ駆動型の スクリプト言語であり、テキストデータのストリームに対して実行される一連のアクションで構成されます。ファイルに対して直接実行するか、パイプラインの一部として使用して、フォーマットされたテキストの生成などのテキストの抽出または変換を行います。レポート。この言語では、文字列 データ型連想配列(つまり、キー文字列でインデックス付けされた配列)、および正規表現が広く使用されていますAWKの対象となるアプリケーションドメインは限られており、特に1ライナープログラムをサポートするように設計されていますが、言語はチューリング完全です。、そしてAWKの初期のBell Labsユーザーでさえ、よく構造化された大規模なAWKプログラムを作成することがよくありました。[5]

AWKは1970年代にベル研究所で作成され[6] [より良い情報源が必要] 、その名前はその作者であるアルフレッド・エイホピーター・ワインバーガーブライアン・カーニハン名前に由来しています。頭字語は、 AWKプログラミング言語の表紙にあるbirdaukと同じように発音されます。[7] のようにすべて小文字で書かれている場合、AWKプログラミング言語で書かれたスクリプトを実行 するUnixまたはPlan9プログラムを指します。awk

歴史

AWKは、1977年にAlfred Ahoegrepの作成者)、Peter J. Weinberger(小さなリレーショナルデータベースに取り組んだ)、およびBrianKernighanによって最初に開発されました。AWKの名前は、それぞれのイニシャルに由来しています。Kernighanによると、AWKの目標の1つは、数字と文字列の両方を簡単に操作できるツールを用意することでした。AWKは、入力データのパターンを検索するために使用され、yaccを使用して実装されたMarcRochkindのプログラミング言語にも触発されました。[8]

バージョン7Unixに登場する初期のツールの1つとして、AWKは、標準のUnix環境で使用できる唯一のスクリプト言語であるBourneシェルに加えて、Unixパイプラインに計算機能を追加しました。これは、 Single UNIX Specification [9]の必須ユーティリティの1つであり、LinuxStandardBase仕様必要とされています。[10]

AWKは1985年から88年に大幅に改訂および拡張され、その結果、 1988にリリースされたPaul RubinJay Fenlason およびRichardStallmanによって作成されたGNUAWK実装が作成されまし GNUベースのLinuxパッケージに含まれています。GNU AWKは、1994年以来アーノルドロビンスによってのみ維持されています。 [11]ブライアンカーニハンnawk(New AWK)ソースは、1993年に非公開で最初にリリースされ、1990年代後半から公開されました。多くのBSDシステムは、GPLライセンスを回避するためにこれを使用しています。[11]

AWKの前にはsed(1974)がありました。どちらもテキスト処理用に設計されています。これらはライン指向のデータ駆動型パラダイムを共有しており、暗黙のメインループと現在のライン変数があるため、ワンライナープログラムの作成に特に適しています。初期のAWKプログラムのパワーと簡潔さ、特にワンライナーを容易にする暗黙の変数による強力な正規表現の処理と簡潔さは、当時のAWKの制限とともに、Perl言語(1987)の重要なインスピレーションでした。1990年代に、Perlは非常に人気があり、Unixテキスト処理言語のニッチでAWKと競合しました。

AWKプログラムの構造

POSIX awk.pdf

AWKは一度に1行ずつ入力を読み取ります。プログラム内のパターンごとに1行がスキャンされ、一致するパターンごとに、関連するアクションが実行されます。

— アルフレッドV.アホ[13]

AWKプログラムは、次のように記述された一連のパターンアクションペアです。

条件 { アクション }
条件 { アクション } 
..。

ここで、条件は通常式であり、アクションは一連のコマンドです。入力はレコードに分割されます。デフォルトでは、レコードは改行文字で区切られているため、入力は行に分割されます。プログラムは、各レコードを各条件に対して順番にテストし、真である各式のアクションを実行します。条件またはアクションのいずれかを省略できます。条件はデフォルトですべてのレコードに一致します。デフォルトのアクションは、レコードを印刷することです。これはsedと同じパターンアクション構造です。

foo == 1またはなどの単純なAWK式に加えて/^foo/、条件は、すべてのレコードが読み取られる前または後にアクションが実行されるようにするか、またはBEGINパターン1に一致するレコードで始まるレコードの範囲に一致するpattern1、pattern2になります将来の行 でpattern1との照合を再試行する前に、 pattern2と一致するレコードを含めます。END

通常の算術演算子と論理演算子に加えて、AWK式には、正規表現~を文字列と照合するtilde演算子が含まれています。便利なシンタックスシュガーとして、チルダ演算子を使用しない/regexp/は現在のレコードと一致します。この構文はsedから派生しており、sedは、検索に使用されるedエディターから継承しています。正規表現の区切り文字としてスラッシュを使用するこの構文は、その後PerlECMAScriptで採用され、現在では一般的になっています。チルダ演算子もPerlに採用されました。 /

コマンド

AWKコマンドは、上記の例のアクションの代わりとなるステートメントです。AWKコマンドには、関数呼び出し、変数の割り当て、計算、またはそれらの任意の組み合わせを含めることができます。AWKには、多くの機能のサポートが組み込まれています。AWKのさまざまなフレーバーによってさらに多くの機能が提供されます。また、一部のフレーバーは、動的にリンクされたライブラリの組み込みをサポートしており、より多くの機能を提供することもできます。

印刷コマンド _

printコマンドは、テキストを出力するために使用されます出力テキストは常に、デフォルト値が改行である出力レコード区切り文字(ORS)と呼ばれる事前定義された文字列で終了します。このコマンドの最も単純な形式は次のとおりです。

print
現在のレコードの内容が表示されます。AWKでは、レコードはフィールドに分割され、これらは個別に表示できます。
print $1
現在のレコードの最初のフィールドを表示します
print $1, $3
現在のレコードの最初と3番目のフィールドを、デフォルト値が単一のスペース文字である出力フィールドセパレーター(OFS)と呼ばれる事前定義された文字列で区切って表示します。

これらのフィールド($ X )は変数($記号はPerlの変数を示します)に似ているかもしれませんが、実際には現在のレコードのフィールドを参照しています。特殊なケースである$0は、レコード全体を指します。実際、コマンド「print」と「print $0」は機能が同じです。

printコマンドは、計算や関数呼び出しの結果を表示することもできます。

/ regex_pattern /  { #レコード(行
    が上記のregex_patternと一致する場合に実行する
    アクションprint  3 + 2 
    print  foobar 3 
    print  foobar variable 
    print  sin 3-2 }

出力はファイルに送信される場合があります:

/ regex_pattern /  { 
    #レコード(行)が上記のregex_patternに一致する場合に実行するアクション
    print  "expression"  >  "file name" 
}

またはパイプを介して:

/ regex_pattern /  { 
    #レコード(行)が上記のregex_patternに一致する場合に実行するアクション
    print  "expression"  |  "コマンド" 
}

組み込み変数

Awkの組み込み変数には、フィールド変数($ 1、$ 2、$ 3など)が含まれます($ 0はレコード全体を表します)。これらは、レコード内の個々のテキストフィールドにテキストまたは値を保持します。

その他の変数は次のとおりです。

  • NR:レコード数。すべてのデータファイルからこれまでに読み取られた入力レコードの数の現在のカウントを保持します。ゼロから始まりますが、自動的にゼロにリセットされることはありません。[14]
  • FNR:ファイルレコード数。現在のファイルでこれまでに読み取られた入力レコードの数の現在のカウントを保持します。この変数は、新しいファイルが開始されるたびに自動的にゼロにリセットされます。[14]
  • NF:フィールド数。現在の入力レコードのフィールド数が含まれます。入力レコードの最後のフィールドは$NFで、最後から2番目のフィールドは$(NF-1)で、最後から3番目のフィールドは$(NF-2)で指定できます。
  • FILENAME:現在の入力ファイルの名前が含まれます。
  • FS:フィールドセパレータ。入力レコードのフィールドを分割するために使用される「フィールドセパレータ」が含まれます。デフォルトの「空白」では、スペースとタブ文字の任意のシーケンスを使用できます。FSを別の文字または文字シーケンスで再割り当てして、フィールド区切り文字を変更できます。
  • RS:レコードセパレータ。現在の「レコード区切り文字」文字を格納します。デフォルトでは、入力行は入力レコードであるため、デフォルトのレコード区切り文字は「改行」です。
  • OFS:出力フィールドセパレータ。Awkがフィールドを印刷するときにフィールドを区切る「出力フィールドセパレータ」を格納します。デフォルトは「スペース」文字です。
  • ORS:出力レコード区切り文字。Awkが出力レコードを印刷するときに出力レコードを分離する「出力レコードセパレータ」を格納します。デフォルトは「改行」文字です。
  • OFMT: 出力フォーマット。数値出力の形式を格納します。デフォルトの形式は「%.6g」です。

変数と構文

変数名には、言語キーワードを除いて、任意の文字[A-Za-z0-9_]を使用できます。演算子+-*/は、それぞれ加算、減算、乗算、除算を表します。文字列を連結するには、2つの変数(または文字列定数)を並べて配置するだけです。文字列定数が含まれる場合は、間にスペースを使用することはオプションですが、互いに隣接して配置された2つの変数名には、間にスペースが必要です。二重引用符は文字列定数を区切ります。ステートメントはセミコロンで終わる必要はありません。最後に、行の最初の文字として を使用して、プログラムにコメントを追加できます。

ユーザー定義関数

Cと同様の形式では、関数定義は、キーワードfunction、関数名、引数名、および関数本体で構成されます。関数の例を次に示します。

function  add_three  number  { 
    return  number  +  3 
}

このステートメントは、次のように呼び出すことができます。

パターン { 
   print  add_three 36      #出力'' '39''' 
}

関数は、ローカルスコープにある変数を持つことができます。これらの名前は引数リストの最後に追加されますが、関数を呼び出すときはこれらの値を省略してください。引数リストのローカル変数の前に空白を追加して、パラメーターの終了位置とローカル変数の開始位置を示すのが一般的です。

HelloWorld

これがAWKで書かれ た通常の「Hello、world 」プログラムです。

BEGIN  {  print  "Hello、world!"  }

ここでは明示的なexitステートメントは必要ないことに注意してください。唯一のパターンはBEGINであるため、コマンドライン引数は処理されません。

80文字を超える行を印刷する

80文字より長いすべての行を印刷します。デフォルトのアクションは現在の行を印刷することであることに注意してください。

長さ$ 0  >  80

単語を数える

入力内の単語をカウントし、行数、単語数、および文字数(wcなど)を出力します。

{ 
    words  + =  NF 
    chars  + =  length  +  1  #各レコード(行)の最後の改行文字を説明するために1を追加します
} 
END  {  print  NR  words  chars  }

プログラムの最初の行にはパターンがないため、入力のすべての行がデフォルトで一致するため、増分アクションはすべての行に対して実行されます。words += NFこれはの省略形であることに注意してくださいwords = words + NF

最後の単語を合計する

{  s  + =  $ NF  } 
END  {  print  s  +  0  }

sは、AWKのフィールド区切り文字(デフォルトでは空白)で定義されている行の最後の単語である$NFの数値によって増分されます。NFは、現在の行のフィールド数です。たとえば、 4です。 $ 4は4番目のフィールドの値であるため、$ NFは、この行のフィールド数やフィールド数に関係なく、行の最後のフィールドの値です。または周囲の線よりも少ないフィールド。$は、実際には、演算子の優先順位が最も高い単項演算子です。(行にフィールドがない場合、NFは0、$ 0は行全体です。この場合、空白を除いて空であるため、数値は0になります。)

入力の最後でENDパターンが一致するため、sが出力されます。ただし、入力行がまったくない可能性があるため、この場合、sに値が割り当てられていないため、デフォルトでは空の文字列になります。変数にゼロを追加することは、変数を文字列から数値に強制変換するためのAWKイディオムです。(空の文字列を連結することは、数値から文字列に強制変換することです。たとえば、s ""。文字列を連結する演算子はありません。文字列は隣接して配置されます。)強制変換を使用すると、プログラムは空の入力に「0」を出力します。 、それがないと、空の行が印刷されます。

入力行の範囲を一致させる

NR   4  ==  1  NR   4  ==  3  {  printf  "%6d%s \ n"  NR  $ 0  }

actionステートメントは、番号が付けられた各行を出力します。printf関数は、標準のC printfをエミュレートし、上記のprintコマンドと同様に機能します。ただし、一致するパターンは次のように機能します。NRはレコード数であり、通常は入力行です。AWKはこれまでに読み取った、つまり現在の行番号で、入力の最初の行の1から始まります。モジュロ演算子です。NR%4 == 1は、入力の1行目、5行目、9行目などに当てはまります。同様に、NR%4 == 33行目、7行目、11行目などの入力行に当てはまります。範囲パターンは、1行目で最初の部分が一致するまでfalseであり、3行目で2番目の部分が一致するときまでtrueのままです。その後、5行目で最初の部分が再び一致するまでfalseのままです。

したがって、プログラムは1、2、3行目を出力し、4行目をスキップして、5、6、7というように続けます。行ごとに、行番号(6文字幅のフィールド)を出力してから、行の内容を出力します。たとえば、この入力で実行すると、次のようになります。

ローマ
フィレンツェ
ミラノ
ナポリ
トリノ
ヴェネツィア

前のプログラムは次のように出力します。

     1ローマ
     2フィレンツェ
     3ミラノ
     5トリノ
     6ヴェネツィア

ファイルの最初または最後の部分を印刷する

特別な場合として、範囲パターンの最初の部分が常に真である場合、たとえば1の場合、範囲は入力の先頭から始まります。同様に、2番目の部分が常にfalse(たとえば、0)の場合、範囲は入力が終了するまで続きます。例えば、

 /^-ここでカット--$/  0

正規表現^-cuthere--$に一致する最初の行からの入力行、つまり「--cuthere--」という句のみを含む行を最後まで出力します。

単語の頻度を計算する

連想配列を使用した単語の頻度

BEGIN  { 
    FS = "[^ a-zA-Z] +" 
} 
{ 
    for  i = 1 ;  i <= NF ;  i ++ 
        words [ tolower $ i )] ++ 
} 
END  { 
    for  i  in  words 
        print  i  words [ i ] 
}

BEGINブロックは、フィールド区切り文字をアルファベット以外の文字の任意のシーケンスに設定します。区切り文字は正規表現にすることができることに注意してください。その後、すべての入力行でアクションを実行するベアアクションに到達します。この場合、行のすべてのフィールドについて、最初に小文字に変換された単語が表示される回数に1を加算します。最後に、ENDブロックで、単語とその頻度を出力します。この線

for(i in words)

配列の単語を通過するループを作成し、iを配列の各添え字に設定します。これは、そのようなループが配列内の各を通過するほとんどの言語とは異なります。したがって、ループは各単語の後にその頻度カウントを出力します。tolower本が出版された後に作られたOneTrueawk(下記参照)への追加でした。

コマンドラインからパターンを一致させる

このプログラムは、いくつかの方法で表すことができます。1つ目は、Bourneシェルを使用して、すべてを実行するシェルスクリプトを作成します。これは、これらのメソッドの中で最も短いものです。

#!/ bin / sh

pattern = " $ 1 " 
shift 
awk '/' " $ pattern " '/ {print FILENAME ":" $ 0}'  " $ @ "

awkコマンドの$patterninは一重引用符で保護されていないため、シェルは変数を展開しますが、スペースを含むパターンを適切に処理するには、二重引用符で囲む必要があります。$0通常の方法でパターン自体が、行全体( )が一致するかどうかを確認します。FILENAME現在のファイル名が含まれます。awkには明示的な連結演算子はありません。2つの隣接する文字列がそれらを連結します。$0元の変更されていない入力行に展開されます。

これを書く別の方法があります。このシェルスクリプトは、awk内から直接環境にアクセスします。

#!/ bin / sh

export  pattern = " $ 1 " 
shift 
awk '$ 0〜ENVIRON ["pattern"] {print FILENAME ":" $ 0}'  " $ @ "

ENVIRONこれは、本が出版された後にOneTrueawkの新しいバージョンで導入された配列であるを使用するシェルスクリプトです。の添え字はENVIRON環境変数の名前です。その結果が変数の値です。これは、さまざまな標準ライブラリやPOSIXのgetenv関数に似ています。シェルスクリプトは、最初の引数を含む環境変数を作成し、次にその引数を削除して、各ファイルのパターンをawkで検索します。 pattern

~左のオペランドが右のオペランドと一致するかどうかを確認します。!~その逆です。正規表現は単なる文字列であり、変数に格納できることに注意してください。

次の方法では、コマンドライン変数の割り当てを使用します。この場合、awkへの引数は、変数への割り当てと見なすことができます。

#!/ bin / sh

pattern = " $ 1 " 
shift 
awk '$ 0〜pattern {print FILENAME ":" $ 0}'  "pattern = $ pattern "  " $ @ "

または、-v var = valueコマンドラインオプションを使用できます(例:awk -v pattern = "$ pattern" ...)。

最後に、これは純粋なawkで記述されており、シェルの助けを借りずに、またはawkスクリプトの実装についてあまり知る必要がありません(コマンドラインでの変数の割り当てのように)が、少し長いです:

BEGIN  { 
    pattern  =  ARGV [ 1 ] 
    for  i  =  1 ;  i  <  ARGC ;  i ++  #最初の引数を
        削除ARGV [ i ]  =  ARGV [ i  +  1 ] 
    ARGC --if 
    ARGC == 1 { #パターンだけだったので、標準入力から強制的に読み取られました(本で使用)ARGC = 2 ARGV [ 1 ] =     
          
          "-" 
    } 
} 
$ 0〜pattern { print FILENAME " " $ 0  }       

これBEGINは、最初の引数を抽出するだけでなく、BEGINブロックの終了後にファイル名として解釈されないようにするためにも必要です。、引数の数は、スクリプトを実行したコマンドの名前(ほとんどの場合は文字列)とARGC同様に、常に1以上であることが保証されていますまた、これは空の文字列であることに注意してください行の終わりまで展開するコメントを開始します。 ARGV[0]"awk"ARGV[ARGC]""#

ifブロックに注意してください。awkは、コマンドを実行する前に、標準入力から読み取る必要があるかどうかを確認するだけです。この意味は

awk'prog'

ファイル名がないという事実progは、実行される前にのみチェックされるため、のみ機能します。引数がないように明示的ARGCに1に設定した場合、awkは、入力ファイルがもうないと感じたため、単に終了します。したがって、特別なファイル名を使用して標準入力から読み取るように明示的に指定する必要があります-

自己完結型のAWKスクリプト

Unixライクなオペレーティングシステムでは、自己完結型のAWKスクリプトをshebang構文を使用して作成できます。

たとえば、特定のファイルのコンテンツを出力するスクリプトはprint.awk、次のコンテンツで 名前が付けられたファイルを作成することによって作成できます。

#!/ usr / bin / awk -f 
{  print  $ 0  }

次のコマンドで呼び出すことができます。./print.awk <filename>

-f、次の引数がAWKプログラムを読み取るファイルであることをAWKに通知します。これは、sedで使用されるのと同じフラグです。これらはワンライナーによく使用されるため、これらのプログラムは両方とも、個別のファイルではなく、コマンドライン引数として指定されたプログラムをデフォルトで実行します。

バージョンと実装

AWKはもともと1977年に作成され、バージョン7Unixで配布されました。

1985年に、その作者は言語の拡張を開始しました。最も重要なのは、ユーザー定義関数を追加することです。この言語は、1988年に発行された「AWKプログラミング言語」という本で説明されており、その実装はUNIXSystemVのリリースで利用可能になりました。互換性のない古いバージョンとの混同を避けるために、このバージョンは「newawk」またはnawkと呼ばれることもありました。この実装は、1996年に自由ソフトウェアライセンスの下でリリースされ、現在もBrian Kernighanによって維持されています(以下の外部リンクを参照)。[要出典]

UNIX / 32Vなどの古いバージョンのUnixには、 AWKをCに変換するものが含まれてawkccいました。Kernighanは、awkをC++に変換するプログラムを作成しました。その状態は不明です。[15]

  • BWK awkは、 nawkとも呼ばれ、BrianKernighanによるバージョンを指します。もともと言語を説明した本に関連してこの用語が使用されていることと、カーニハンがAWKの原作者の一人であったことから、「OneTrueAWK」と呼ばれています。[7] FreeBSDは、このバージョンをone-true-awkと呼んでいます。[16]このバージョンには、上記で説明した、など、本にはない機能もあります詳細については、ソースアーカイブのFIXESファイルを参照してください。このバージョンは、たとえば、AndroidFreeBSDNetBSDOpenBSDmacOSで使用されます。tolowerENVIRON、およびillumosBrianKernighanとArnoldRobbinsは、 nawkのソースリポジトリへの主な貢献者ですgithub .com / onetrueawk /awk
  • gawkGNU awk)は、もう1つの自由ソフトウェアの実装であり、国際化とローカリゼーション、およびTCP/IPネットワーキングの実装を大幅に進歩させる唯一の実装です。元の実装が自由に利用できるようになる前に書かれました。独自のデバッガーが含まれており、そのプロファイラーを使用すると、ユーザーはスクリプトのパフォーマンスを測定して向上させることができます。また、ユーザーは共有ライブラリを使用して機能を拡張できます。一部のLinuxディストリビューションには、デフォルトのAWK実装としてgawkが含まれています。[要出典]
    • gawk-csvgawkCSV拡張機能は、CSV形式の入力および出力データを処理するための機能を提供します。[17]
  • mawkは、バイトコードインタープリターに基づくMikeBrennanによる非常に高速なAWK実装です。
  • libmawkはmawkのフォークであり、アプリケーションがawkインタープリターの複数の並列インスタンスを埋め込むことを可能にします。
  • awka(フロントエンドはmawkプログラムの上に書かれています)は、AWKスクリプトをCコードに変換するもう1つの方法です。作成者のlibawka.aを静的に含めてコンパイルすると、結果の実行可能ファイルは大幅に高速化され、作成者のテストによると、他のバージョンのAWK、Perl、またはTclと非常によく比較されます。小さなスクリプトは160〜170kBのプログラムになります。
  • tawk(Thompson AWK)は、SolarisDOSOS / 2、およびWindows用のAWKコンパイラであり、以前はThompson Automation Software(活動を停止)によって販売されていました。[18]
  • Jawkは、 SourceForgeでホストされているJavaでAWKを実装するプロジェクトです。[19] AWKスクリプト内のJava機能(つまり、Javaスレッド、ソケット、コレクションなど)へのアクセスを提供するために、言語の拡張機能が追加されています。
  • xgawkは、動的にロード可能なライブラリでgawkを 拡張するgawk [20]のフォークです。XMLgawk拡張機能は、公式のGNUAwkリリース4.1.0に統合されました。
  • QSEAWKは、QSEライブラリに含まれている組み込みAWKインタープリターの実装であり、CおよびC ++用の組み込みアプリケーションプログラミングインターフェイス(API)を提供します[21]
  • libfawkは、Cで記述された、非常に小さく、関数のみの、再入可能な、埋め込み可能なインタープリターです。
  • BusyBoxには、DmitryZakharovによって作成されたAWK実装が含まれています。これは、組み込みシステムに適した非常に小さな実装です。
  • Michael ParkerによるCLAWKは、同じ作者の正規表現ライブラリに基づいて、CommonLispでAWKの実装を提供します。[22]

書籍

  • アホ、アルフレッドV . ; カーニハン、ブライアンW .; ワインバーガー、ピーターJ.(1988-01-01)。AWKプログラミング言語ニューヨーク州ニューヨーク:Addison-WesleyISBN 0-201-07981-X2017年1月22日取得
  • ロビンズ、アーノルド(2001-05-15)。効果的なawkプログラミング(第3版)。セバストポル、カリフォルニア州:オライリーメディアISBN 0-596-00070-72009年4月16日取得
  • ドハティ、デール; ロビンズ、アーノルド(1997-03-01)。sed&awk(第2版)。セバストポル、カリフォルニア州:オライリーメディア。ISBN 1-56592-225-52009年4月16日取得
  • ロビンズ、アーノルド(2000)。効果的なAwkプログラミング:Gnu Awkのユーザーガイド(1.0.3版)。インディアナ州ブルーミントン:iUniverseISBN 0-595-10034-12009年4月12日にオリジナルからアーカイブされました2009年4月16日取得

も参照してください

参照

  1. ^ Stutz、Michael(2006年9月19日)。「GAWKを始めよう:AWK言語の基礎」(PDF)developerWorksIBM 2015年1月29日取得[AWKは]しばしばデータ駆動言語と呼ばれます-プログラムステートメントは、一連のプログラムステップではなく、照合して処理する入力データを記述します
  2. ^ アンドレアスJ.ピラヴァキス(1989)。UNIXワークショップマクミラン国際高等教育。p。196。
  3. ^ アーノルド・ロビンス(2015)。効果的なAwkプログラミング:ユニバーサルテキスト処理とパターンマッチング(第4版)。オライリーメディア。p。560。
  4. ^ a b James W. Livingston(1988年5月2日)。「オオウミガラスプログラムは鳥の頭脳ではありません」。デジタルレビューp。91。
  5. ^ レイモンド、エリックS. 「ミニ言語の適用」Unixプログラミングの芸術ケーススタディ:awk。2008年7月30日にオリジナルからアーカイブされました2010年5月11日取得awkアクション言語はチューリング完全であり、ファイルの読み取りと書き込みが可能です。
  6. ^ Aho、Alfred V .; カーニハン、ブライアンW .; ワインバーガー、ピーターJ.(1978年9月1日)。Awk —パターンスキャンおよび処理言語(第2版)(テクニカルレポート)。Unix第7版マニュアル、第2巻。ベル研究所。
  7. ^ a b Aho、Alfred V .; カーニハン、ブライアンW .; ワインバーガー、ピーターJ.(1988)。AWKプログラミング言語アディソン-ウェスリー出版社。ISBN 97802010798142015年5月16日取得
  8. ^ 「UNIXスペシャル:Profs Kernighan&Brailsford」Computerphile2015年9月30日。 2021年11月22日のオリジナルからアーカイブ。
  9. ^ 「SingleUNIXSpecification、バージョン3、ユーティリティインターフェイステーブル」2018-01-05にオリジナルからアーカイブされました2005年12月18日取得
  10. ^ 「第15章コマンドとユーティリティ」。Linux Standard Base Core Specification 4.0(テクニカルレポート)。LinuxFoundation。2008年。
  11. ^ a b c ロビンズ、アーノルド(2014年3月)。「GNUプロジェクトと私:GNU AWKでの27年」(PDF)skeeve.com 2014年10月4日取得
  12. ^ Dougherty、デール; ロビンズ、アーノルド(1997)。sed&awk(第2版)。セバストポル、カリフォルニア州:オライリー。p。221. ISBN 1-565-92225-5
  13. ^ ハミルトン、ナオミ(2008年5月30日)。「プログラミング言語のAZ:AWK」Computerworld2008年12月12日取得
  14. ^ a b "レコード(GNU Awkユーザーガイド)"
  15. ^ Kernighan、Brian W.(1991年4月24〜25日)。AWKからC++への翻訳者(PDF)UsenixC++会議。ワシントンDC。pp。217–228。
  16. ^ 「BWKawkをFreeBSDのコアにインポートするためのFreeBSDの作業ログ」2005年5月16日。2013年9月8日のオリジナルからアーカイブ2006年9月20日取得
  17. ^ http: //gawkextlib.sourceforge.net/csv/gawk-csv.htmlのgawk-csvドキュメント
  18. ^ James K. Lawless(1997年5月1日)。「TAWKコンパイラの調査」ドブ博士の日記
  19. ^ SourceForgeのJawk
  20. ^ xgawkホームページ
  21. ^ GitHubのQSEAWK
  22. ^ GitHubのCLAWK

さらに読む

外部リンク