Awk-quick-guide
AWK-概要
AWKはインタープリター型プログラミング言語です。 非常に強力で、テキスト処理用に特別に設計されています。 その名前は、著者の姓に由来します-アルフレッド・アホ、ピーター・ワインバーガー、およびブライアン・カーニガン。
GNU/Linuxが配布するAWKのバージョンは、Free Software Foundation(FSF)によって作成および保守されています。多くの場合、* GNU AWK。*と呼ばれます。
AWKの種類
以下はAWKのバリアントです-
- AWK -AT&T LaboratoryのオリジナルAWK。
- NAWK -AT&T LaboratoryのAWKの新しい改良版。
- GAWK -GNU AWKです。 すべてのGNU/LinuxディストリビューションにはGAWKが付属しています。 AWKおよびNAWKと完全に互換性があります。
AWKの典型的な使用
AWKで無数のタスクを実行できます。 以下にリストされているのはほんの一部です-
- テキスト処理、
- 書式付きテキストレポートの作成、
- 算術演算の実行、
- 文字列操作の実行など。
AWK-環境
この章では、GNU/LinuxシステムでAWK環境をセットアップする方法について説明します。
パッケージマネージャーを使用したインストール
一般的に、AWKはほとんどのGNU/Linuxディストリビューションでデフォルトで利用可能です。 which コマンドを使用して、システムに存在するかどうかを確認できます。 AWKがない場合は、次のようにAdvance Package Tool *(APT)*パッケージマネージャーを使用して、DebianベースのGNU/Linuxにインストールします-
同様に、RPMベースのGNU/LinuxにAWKをインストールするには、次のようにYellowdog Updator Modifier yum パッケージマネージャーを使用します-
インストール後、コマンドラインからAWKにアクセスできることを確認してください。
上記のコードを実行すると、次の結果が得られます-
ソースコードからのインストール
GNU AWKはGNUプロジェクトの一部であるため、そのソースコードは無料でダウンロードできます。 パッケージマネージャーを使用してAWKをインストールする方法は既に説明しました。 ソースコードからAWKをインストールする方法を理解しましょう。
次のインストールは、すべてのGNU/Linuxソフトウェア、および他のほとんどの自由に利用可能なプログラムにも適用できます。 ここにインストール手順があります-
ステップ1 *-本物の場所からソースコードをダウンロードします。 コマンドラインユーティリティ *wget は、この目的に役立ちます。
- ステップ2 *-ダウンロードしたソースコードを解凍して抽出します。
- ステップ3 *-ディレクトリに移動し、configureを実行します。
ステップ4 *-正常に完了すると、 *configure はMakefileを生成します。 ソースコードをコンパイルするには、 make コマンドを発行します。
- ステップ5 *-テストスイートを実行して、ビルドがクリーンであることを確認できます。 これはオプションの手順です。
- ステップ6 *-最後に、AWKをインストールします。 スーパーユーザー権限を持っていることを確認してください。
それだ! AWKが正常にコンパイルおよびインストールされました。 次のように awk コマンドを実行してそれを確認します-
このコードを実行すると、次の結果が得られます-
AWK-ワークフロー
エキスパートのAWKプログラマになるには、その内部を知る必要があります。 AWKは、読み取り、実行、繰り返しという単純なワークフローに従います。 次の図は、AWKのワークフローを示しています-
Read
AWKは、入力ストリーム(ファイル、パイプ、またはstdin)から行を読み取り、メモリに保存します。
実行する
すべてのAWKコマンドは入力に順番に適用されます。 デフォルトでは、AWKはすべての行でコマンドを実行します。 パターンを提供することでこれを制限できます。
繰り返す
このプロセスは、ファイルが最後に達するまで繰り返されます。
プログラム構成
ここで、AWKのプログラム構造を理解しましょう。
BEGINブロック
BEGINブロックの構文は次のとおりです-
構文
BEGINブロックは、プログラムの起動時に実行されます。 一度だけ実行されます。 これは変数を初期化するのに適した場所です。 BEGINはAWKキーワードであるため、大文字でなければなりません。 このブロックはオプションであることに注意してください。
ボディブロック
本体ブロックの構文は次のとおりです-
構文
bodyブロックは、すべての入力行にAWKコマンドを適用します。 デフォルトでは、AWKはすべての行でコマンドを実行します。 パターンを提供することでこれを制限できます。 Bodyブロックにはキーワードがないことに注意してください。
ENDブロック
ENDブロックの構文は次のとおりです-
構文
ENDブロックは、プログラムの最後に実行されます。 ENDはAWKキーワードであるため、大文字でなければなりません。 このブロックはオプションであることに注意してください。
シリアル番号、生徒の名前、科目名、取得したマークの数を含むファイル marks.txt を作成しましょう。
AWKスクリプトを使用して、ヘッダー付きのファイルコンテンツを表示します。
例
このコードが実行されると、次の結果が生成されます-
出力
開始時に、AWKはBEGINブロックからヘッダーを出力します。 次にbodyブロックで、ファイルから行を読み取り、AWKの印刷コマンドを実行します。このコマンドは、コンテンツを標準出力ストリームに印刷するだけです。 このプロセスは、ファイルが最後に達するまで繰り返されます。
AWK-基本構文
AWKは使いやすいです。 AWKコマンドは、コマンドラインから直接、またはAWKコマンドを含むテキストファイルの形式で提供できます。
AWKコマンドライン
次のように、コマンドラインで一重引用符で囲まれたAWKコマンドを指定できます-
例
次の内容を持つテキストファイル marks.txt を検討してください-
次のようにAWKを使用してファイルの完全なコンテンツを表示しましょう-
例
このコードを実行すると、次の結果が得られます-
出力
AWKプログラムファイル
次のように、スクリプトファイルでAWKコマンドを提供できます-
まず、以下に示すようにAWKコマンドを含むテキストファイル command.awk を作成します-
これで、テキストファイルからコマンドを読み取り、アクションを実行するようにAWKに指示できます。 ここで、上記の例で示したのと同じ結果が得られます。
例
このコードを実行すると、次の結果が得られます-
出力
AWK標準オプション
AWKは、コマンドラインから提供できる次の標準オプションをサポートしています。
-vオプション
このオプションは、変数に値を割り当てます。 プログラムの実行前に割り当てることができます。 次の例は、-vオプションの使用法を説明しています。
例
このコードを実行すると、次の結果が得られます-
出力
--dump-variables [= file]オプション
グローバル変数とその最終値のソートされたリストをファイルに出力します。 デフォルトのファイルは awkvars.out です。
例
上記のコードを実行すると、次の結果が得られます-
出力
--helpオプション
このオプションは、標準出力にヘルプメッセージを出力します。
例
このコードを実行すると、次の結果が得られます-
出力
--lint [= fatal]オプション
このオプションは、移植性のない、または疑わしい構成のチェックを可能にします。 引数 fatal を指定すると、警告メッセージがエラーとして扱われます。 次の例はこれを示しています-
例
このコードを実行すると、次の結果が得られます-
出力
--posixオプション
このオプションは、厳密なPOSIX互換性を有効にします。この場合、一般的な拡張機能とgawk固有の拡張機能はすべて無効になります。
--profile [= file]オプション
このオプションは、ファイルにプログラムのきれいに印刷されたバージョンを生成します。 デフォルトのファイルは awkprof.out です。 以下の簡単な例はこれを示しています-
例
このコードを実行すると、次の結果が得られます-
出力
--traditionalオプション
このオプションは、すべてのgawk固有の拡張機能を無効にします。
--versionオプション
このオプションは、AWKプログラムのバージョン情報を表示します。
例
このコードが実行されると、次の結果が生成されます-
出力
AWK-基本的な例
この章では、いくつかの便利なAWKコマンドとその適切な例を説明します。 テキストファイル marks.txt が次の内容で処理されることを考慮してください-
列またはフィールドの印刷
入力フィールドの特定の列のみを印刷するようにAWKに指示できます。 次の例はこれを示しています-
例
このコードを実行すると、次の結果が得られます-
出力
ファイル marks.txt の3番目の列にはサブジェクト名が含まれ、4番目の列には特定のサブジェクトで取得されたマークが含まれます。 AWK印刷コマンドを使用して、これら2つの列を印刷します。 上記の例では、 $ 3と$ 4 はそれぞれ入力レコードの3番目と4番目のフィールドを表します。
すべての行を印刷する
デフォルトでは、AWKはパターンに一致するすべての行を印刷します。
例
このコードを実行すると、次の結果が得られます-
出力
上記の例では、フォームパターン a を検索しています。 パターンマッチが成功すると、ボディブロックからコマンドを実行します。 本体ブロックがない場合-レコードを印刷するデフォルトのアクションが実行されます。 したがって、次のコマンドは同じ結果を生成します-
例
パターンによる列の印刷
パターンマッチが成功すると、AWKはデフォルトでレコード全体を印刷します。 ただし、特定のフィールドのみを印刷するようにAWKに指示できます。 たとえば、次の例では、パターンマッチが成功したときに3番目と4番目のフィールドを出力します。
例
このコードを実行すると、次の結果が得られます-
出力
任意の順序で列を印刷する
列は任意の順序で印刷できます。 たとえば、次の例では、4番目の列に続いて3番目の列が出力されます。
例
上記のコードを実行すると、次の結果が得られます-
出力
一致したパターンのカウントと印刷
パターンマッチが成功した行の数を数えて印刷できる例を見てみましょう。
例
このコードを実行すると、次の結果が得られます-
出力
この例では、パターンマッチが成功したときにcounterの値をインクリメントし、この値をENDブロックに出力します。 他のプログラミング言語とは異なり、変数を使用する前に宣言する必要はありません。
18文字以上の行を印刷する
18文字を超える行のみを印刷してみましょう。
例
このコードを実行すると、次の結果が得られます-
出力
AWKは、文字列の長さを返す組み込みの length 関数を提供します。 $ 0 変数は行全体を格納し、ボディブロックがない場合、デフォルトアクション、つまり印刷アクションが実行されます。 したがって、行に18文字を超える文字が含まれている場合、比較結果はtrueになり、行が印刷されます。
AWK-組み込み変数
AWKはいくつかの組み込み変数を提供します。 AWKスクリプトの作成中に重要な役割を果たします。 この章では、組み込み変数の使用方法を示します。
標準AWK変数
標準のAWK変数については、以下で説明します。
ARGC
コマンドラインで提供される引数の数を意味します。
例
このコードを実行すると、次の結果が得られます-
出力
しかし、4つの引数のみを渡したときにAWKが5と表示するのはなぜですか? 次の例を確認して、疑問を解決してください。
ARGV
コマンドライン引数を格納する配列です。 配列の有効なインデックスの範囲は0〜ARGC-1です。
例
このコードを実行すると、次の結果が得られます-
出力
CONVFMT
数値の変換形式を表します。 デフォルト値は*%。6g *です。
例
このコードを実行すると、次の結果が得られます-
出力
エンビロン
環境変数の連想配列です。
例
このコードを実行すると、次の結果が得られます-
出力
他の環境変数の名前を見つけるには、 env コマンドを使用します。
ファイル名
現在のファイル名を表します。
例
このコードを実行すると、次の結果が得られます-
- 出力 *
FILENAMEはBEGINブロックでは定義されていないことに注意してください。
FS
(入力)フィールドセパレーターを表し、デフォルト値はスペースです。* -F *コマンドラインオプションを使用してこれを変更することもできます。
例
このコードを実行すると、次の結果が得られます-
出力
NF
現在のレコードのフィールドの数を表します。 たとえば、次の例では、3つ以上のフィールドを含む行のみを印刷します。
例
このコードを実行すると、次の結果が得られます-
出力
NR
現在のレコードの番号を表します。 たとえば、現在のレコード番号が3未満の場合、次の例はレコードを印刷します。
例
このコードを実行すると、次の結果が得られます-
出力
FNR
NRに似ていますが、現在のファイルに対して相対的です。 AWKが複数のファイルで動作している場合に便利です。 FNRの値は新しいファイルでリセットされます。
OFMT
出力形式番号を表し、デフォルト値は*%。6g *です。
例
このコードを実行すると、次の結果が得られます-
出力
OFS
出力フィールドの区切り文字を表し、デフォルト値はスペースです。
例
このコードを実行すると、次の結果が得られます-
出力
ORS
出力レコードの区切りを表し、デフォルト値は改行です。
例
上記のコードを実行すると、次の結果が得られます-
出力
RLENGTH
例
このコードを実行すると、次の結果が得られます-
出力
RS
(入力)レコード区切り文字を表し、デフォルト値は改行です。
例
このコードを実行すると、次の結果が得られます-
出力
RSTART
これは、 match 関数で一致した文字列の最初の位置を表します。
例
このコードを実行すると、次の結果が得られます-
出力
サブセップ
配列添え字の区切り文字を表し、デフォルト値は \ 034 です。
例
このコードを実行すると、次の結果が得られます-
出力
$0
入力レコード全体を表します。
例
このコードを実行すると、次の結果が得られます-
出力
$n
フィールドがFSで区切られている現在のレコードのn ^ th ^フィールドを表します。
例
このコードを実行すると、次の結果が得られます-
出力
GNU AWK固有の変数
GNU AWK固有の変数は次のとおりです-
アージンド
これは、処理中の現在のファイルのARGVのインデックスを表します。
例
このコードを実行すると、次の結果が得られます-
- 出力 *
BINMODE
非POSIXシステム上のすべてのファイルI/Oにバイナリモードを指定するために使用されます。 1、2、または3の数値は、それぞれ入力ファイル、出力ファイル、またはすべてのファイルがバイナリI/Oを使用することを指定します。* r または *w の文字列値は、それぞれ入力ファイルまたは出力ファイルがバイナリI/Oを使用することを指定します。 rw または wr の文字列値は、すべてのファイルがバイナリI/Oを使用することを指定します。
ERRNO
文字列は、 getline のリダイレクトが失敗した場合、または close 呼び出しが失敗した場合のエラーを示します。
例
このコードを実行すると、次の結果が得られます-
出力
FIELDWIDTHS
フィールド幅変数のスペース区切りリストが設定され、GAWKはFS変数の値をフィールド区切り文字として使用する代わりに、入力を固定幅のフィールドに解析します。
無視
この変数が設定されると、GAWKは大文字と小文字を区別しなくなります。 次の例はこれを示しています-
例
このコードを実行すると、次の結果が得られます-
出力
LINT
GAWKプログラムからの*-lint オプションの動的制御を提供します。 この変数が設定されると、GAWKはlint警告を出力します。 文字列値fatalを割り当てると、lint警告は-lint = fatal *とまったく同じように致命的なエラーになります。
例
このコードを実行すると、次の結果が得られます-
出力
PROCINFO
これは、実および有効なUID番号、プロセスID番号など、プロセスに関する情報を含む連想配列です。
例
このコードを実行すると、次の結果が得られます-
出力
テキストドメイン
AWKプログラムのテキストドメインを表します。 プログラムの文字列のローカライズされた翻訳を見つけるために使用されます。
例
このコードを実行すると、次の結果が得られます-
出力
上記の出力は、 en_IN ロケールによる英語のテキストを示しています
AWK-演算子
他のプログラミング言語と同様に、AWKも多数の演算子を提供します。 この章では、AWKオペレーターと適切な例を説明します。
S.No. | Operators & Description |
---|---|
1 |
AWKは次の算術演算子をサポートしています。 |
2 |
Increment and Decrement Operators AWKは、次のインクリメント演算子とデクリメント演算子をサポートしています。 |
3 |
AWKは次の代入演算子をサポートしています。 |
4 |
AWKは次の関係演算子をサポートしています。 |
5 |
AWKは次の論理演算子をサポートしています。 |
6 |
三項演算子を使用して条件式を簡単に実装できます。 |
7 |
AWKは次の単項演算子をサポートしています。 |
8 |
指数演算子には2つの形式があります。 |
9 |
スペースは、2つの文字列を結合する文字列連結演算子です。 |
10 |
|
11 |
この例では、2つの形式の正規表現演算子について説明します。 |
AWK-正規表現
AWKは、正規表現の処理において非常に強力で効率的です。 単純な正規表現を使用すると、多くの複雑なタスクを解決できます。 コマンドラインのエキスパートなら誰でも、正規表現の力を知っています。
この章では、標準の正規表現と適切な例を取り上げます。
Dot
行末文字を除く任意の単一文字に一致します。 たとえば、次の例は fin、fun、fan などに一致します。
例
上記のコードを実行すると、次の結果が得られます-
出力
行頭
行頭と一致します。 たとえば、次の例は、パターン The で始まるすべての行を出力します。
例
このコードを実行すると、次の結果が得られます-
出力
行末
行末に一致します。 たとえば、次の例では、文字 n で終わる行を印刷します。
例
出力
このコードを実行すると、次の結果が得られます-
一致する文字セット
これは、複数の文字のうち1つだけを照合するために使用されます。 たとえば、次の例はパターン Call および Tall に一致しますが、 Ball には一致しません。
例
出力
このコードを実行すると、次の結果が得られます-
専用セット
排他セットでは、カラットは角括弧内の文字セットを無効にします。 たとえば、次の例では Ball のみが出力されます。
例
このコードを実行すると、次の結果が得られます-
出力
変更
垂直バーを使用すると、正規表現を論理的にOR演算できます。 たとえば、次の例では、 Ball および Call が出力されます。
例
このコードを実行すると、次の結果が得られます-
出力
ゼロまたは1つの発生
直前の文字のゼロまたは1回の出現に一致します。 たとえば、次の例は Color と Color に一致します。 ?*を使用して、オプション文字として *u を作成しました。
例
このコードを実行すると、次の結果が得られます-
出力
ゼロ以上の発生
直前の文字の0回以上の出現に一致します。 たとえば、次の例は* ca、cat、catt、*などに一致します。
例
このコードを実行すると、次の結果が得られます-
出力
1つ以上の発生
直前の文字の1回以上の出現に一致します。 たとえば、以下の例は、1つ以上の 2 の出現に一致します。
例
上記のコードを実行すると、次の結果が得られます-
出力
グルーピング
括弧()*はグループ化と文字|に使用されます。は代替に使用されます。 たとえば、次の正規表現は、 *Apple JuiceまたはApple Cake を含む行に一致します。
例
このコードを実行すると、次の結果が得られます-
出力
AWK-配列
AWKには連想配列があり、それに関する最も良いことの1つは、インデックスが連続した数字のセットである必要がないことです。文字列または数値のいずれかを配列インデックスとして使用できます。 また、事前に配列のサイズを宣言する必要はありません。配列は実行時に拡大/縮小できます。
その構文は次のとおりです-
構文
ここで、 array_name は配列の名前、 index は配列のインデックス、 value は配列の要素に割り当てる値です。
配列の作成
配列についてより深く理解するために、配列の要素を作成してアクセスしてみましょう。
例
このコードを実行すると、次の結果が得られます-
出力
上記の例では、配列を fruits として宣言します。そのインデックスはフルーツ名で、値はフルーツの色です。 配列要素にアクセスするには、 array_name [index] 形式を使用します。
配列要素の削除
挿入には、代入演算子を使用しました。 同様に、 delete ステートメントを使用して、配列から要素を削除できます。 削除ステートメントの構文は次のとおりです-
構文
次の例では、要素 orange を削除します。 したがって、コマンドは出力を表示しません。
例
多次元配列
AWKは1次元配列のみをサポートします。 ただし、1次元配列自体を使用して、多次元配列を簡単にシミュレートできます。
たとえば、以下は3x3の2次元配列です-
上記の例では、array [0] [0]は100を格納し、array [0] [1]は200を格納します。 配列の場所[0] [0]に100を格納するには、次の構文を使用できます-
構文
インデックスとして 0,0 を指定しましたが、これらは2つのインデックスではありません。 実際には、これはストリング 0,0 を持つ1つのインデックスにすぎません。
次の例は、2D配列をシミュレートします-
例
このコードを実行すると、次の結果が得られます-
出力
要素/インデックスの並べ替えなど、配列に対してさまざまな操作を実行することもできます。 そのために、 assort および asorti 関数を使用できます
AWK-制御フロー
他のプログラミング言語と同様に、AWKはプログラムのフローを制御する条件ステートメントを提供します。 この章では、AWKの制御ステートメントと適切な例を説明します。
ifステートメント
単純に条件をテストし、条件に応じて特定のアクションを実行します。 以下に示すのは、 if ステートメントの構文です-
構文
また、以下に示すように中括弧のペアを使用して複数のアクションを実行することもできます-
構文
たとえば、次の例では、数値が偶数かどうかを確認します-
例
上記のコードを実行すると、次の結果が得られます-
出力
If Elseステートメント
構文
上記の構文では、条件がtrueと評価されるとaction-1が実行され、条件がfalseと評価されるとaction-2が実行されます。 たとえば、次の例では、数値が偶数かどうかを確認します-
例
このコードを実行すると、次の結果が得られます-
出力
If-Else-Ifラダー
複数の if-else ステートメントを使用して、 if-else-if ラダーを簡単に作成できます。 次の例はこれを示しています-
例
このコードを実行すると、次の結果が得られます-
出力
AWK-ループ
この章では、AWKのループと適切な例を説明します。 ループは、一連のアクションを繰り返し実行するために使用されます。 ループ条件が真である限り、ループの実行が継続されます。
ループ用
構文
最初に、 for ステートメントが初期化アクションを実行してから、条件をチェックします。 条件が真の場合、アクションを実行し、その後、インクリメントまたはデクリメント操作を実行します。 条件が真である限り、ループの実行が継続されます。 たとえば、次の例では、 for ループを使用して1〜5を出力します-
例
このコードを実行すると、次の結果が得られます-
出力
Whileループ
構文
AWKは最初に条件をチェックします。条件が真の場合、アクションを実行します。 このプロセスは、ループ条件がtrueと評価される限り繰り返されます。 たとえば、次の例では、 while ループを使用して1〜5を出力します-
例
このコードを実行すると、次の結果が得られます-
出力
Do-Whileループ
構文
例
このコードを実行すると、次の結果が得られます-
出力
ブレイクステートメント
その名前が示すように、ループの実行を終了するために使用されます。 合計が50を超えるとループを終了する例を次に示します。
例
このコードを実行すると、次の結果が得られます-
出力
声明を続ける
例
このコードを実行すると、次の結果が得られます-
出力
終了ステートメント
スクリプトの実行を停止するために使用されます。 AWKプロセスの終了ステータスコードである整数を引数として受け入れます。 引数が指定されていない場合、 exit はステータス0を返します。 合計が50を超えると実行を停止する例を次に示します。
例
出力
このコードを実行すると、次の結果が得られます-
スクリプトの戻りステータスを確認しましょう。
例
このコードを実行すると、次の結果が得られます-
出力
AWK-組み込み関数
AWKには、プログラマーが常に利用できる多くの関数が組み込まれています。 この章では、算術演算、文字列、時間、ビット操作、およびその他のさまざまな関数について、適切な例を挙げて説明します。
S.No. | Built in functions & Description |
---|---|
1 |
AWKには、次の組み込みの算術関数があります。 |
2 |
AWKには次の組み込み文字列関数があります。 |
3 |
AWKには、次の組み込みの時間関数があります。 |
4 |
AWKには、次の組み込みビット操作関数があります。 |
5 |
AWKには、次のその他の機能があります。 |
AWK-ユーザー定義関数
関数は、プログラムの基本的な構成要素です。 AWKでは、独自の関数を定義できます。 大きなプログラムは機能に分割でき、各機能は個別に作成/テストできます。 コードの再利用性を提供します。
以下は、ユーザー定義関数の一般的な形式です-
構文
この構文では、 function_name はユーザー定義関数の名前です。 関数名は文字で始める必要があり、残りの文字は数字、アルファベット文字、またはアンダースコアの任意の組み合わせにすることができます。 AWKの予約語は関数名として使用できません。
関数は、コンマで区切られた複数の引数を受け入れることができます。 引数は必須ではありません。 引数なしでユーザー定義関数を作成することもできます。
- 関数本体*は1つ以上のAWKステートメントで構成されます。
最小数と最大数を計算する2つの関数を作成し、これらの関数を main という別の関数から呼び出しましょう。 functions.awk ファイルには含まれています-
例
このコードを実行すると、次の結果が得られます-
出力
AWK-出力のリダイレクト
これまで、標準出力ストリームにデータを表示しました。 データをファイルにリダイレクトすることもできます。 print または printf ステートメントの後にリダイレクトが表示されます。 AWKのリダイレクトは、シェルコマンドのリダイレクトと同様に記述されますが、AWKプログラム内で記述される点が異なります。 この章では、適切な例を使用してリダイレクトについて説明します。
リダイレクト演算子
リダイレクト演算子の構文は次のとおりです-
構文
データを output-file に書き込みます。 出力ファイルが存在しない場合は、作成します。 このタイプのリダイレクトを使用すると、最初の出力が書き込まれる前に出力ファイルが消去されます。 同じ出力ファイルへの後続の書き込み操作では、出力ファイルは消去されませんが、追加されます。 たとえば、次の例では、 Hello、World !!! をファイルに書き込みます。
いくつかのテキストデータを含むファイルを作成しましょう。
例
このコードを実行すると、次の結果が得られます-
出力
ここで、AWKのリダイレクト演算子を使用して、コンテンツをそこにリダイレクトします。
例
このコードを実行すると、次の結果が得られます-
出力
演算子を追加
追加演算子の構文は次のとおりです-
構文
データを output-file に追加します。 出力ファイルが存在しない場合は、作成します。 このタイプのリダイレクトを使用すると、新しいコンテンツがファイルの最後に追加されます。 たとえば、次の例では、 Hello、World !!! をファイルに追加します。
いくつかのテキストデータを含むファイルを作成しましょう。
例
このコードを実行すると、次の結果が得られます-
出力
次に、AWKの追加演算子を使用して、コンテンツを追加します。
例
このコードを実行すると、次の結果が得られます-
出力
Pipe
ファイルを使用する代わりに、パイプを介して別のプログラムに出力を送信することができます。 このリダイレクトにより、コマンドへのパイプが開かれ、このパイプを介してアイテムの値が別のプロセスに書き込まれてコマンドが実行されます。 リダイレクト引数コマンドは、実際にはAWK式です。 パイプの構文は次のとおりです-
構文
例
このコードを実行すると、次の結果が得られます-
出力
双方向通信
AWKは、双方向通信である* |&を使用して外部プロセスと通信できます。 たとえば、次の例では *tr コマンドを使用して小文字を大文字に変換します。 私たちの command.awk ファイルには以下が含まれています-
例
このコードを実行すると、次の結果が得られます-
出力
スクリプトは不可解に見えますか? それを分かりやすく説明しましょう。
- 最初のステートメント cmd = "tr [a-z] [A-Z]" は、AWKからの双方向通信を確立するコマンドです。
- 次のステートメント、つまりprintコマンドは、 tr コマンドへの入力を提供します。 ここで、*&| *は双方向通信を示します。
- 3番目のステートメント、つまり* close(cmd、 "to")は、実行の競合後に *to プロセスを閉じます。
- 次のステートメント cmd |&getline out は、getline関数を使用して output をout変数に格納します。
- 次のprintステートメントは出力を印刷し、最後に close 関数がコマンドを閉じます。
AWK-プリティ印刷
これまで、AWKの print および printf 関数を使用して、標準出力にデータを表示しました。 しかし、printfはこれまで見てきたよりもはるかに強力です。 この関数はC言語から借用されており、フォーマットされた出力を生成する際に非常に役立ちます。 以下は、printfステートメントの構文です-
構文
上記の構文では、 fmt はフォーマット仕様と定数の文字列です。 expr-list は、書式指定子に対応する引数のリストです。
エスケープシーケンス
他の文字列と同様に、フォーマットには埋め込みエスケープシーケンスを含めることができます。 以下で説明するのは、AWKでサポートされるエスケープシーケンスです-
改行
次の例では、改行文字を使用して Hello と World を別々の行に出力します-
例
このコードを実行すると、次の結果が得られます-
出力
水平タブ
次の例では、水平タブを使用して異なるフィールドを表示します-
例
上記のコードを実行すると、次の結果が得られます-
出力
垂直タブ
次の例では、各フィールドの後に垂直タブを使用しています-
例
このコードを実行すると、次の結果が得られます-
出力
バックスペース
次の例では、最後のフィールドを除くすべてのフィールドの後にバックスペースを出力します。 最初の3つのフィールドから最後の数字を消去します。 たとえば、最後の文字がバックスペースで消去されるため、 Field 1 は Field として表示されます。 ただし、 Field 4 の後に \ b がなかったため、最後のフィールド Field 4 がそのまま表示されます。
例
このコードを実行すると、次の結果が得られます-
出力
キャリッジリターン
次の例では、すべてのフィールドを印刷した後、 Carriage Return を実行し、現在の印刷値の上に次の値を印刷します。 これは、最終出力では Field 4 のみが表示されることを意味します。これは、前のすべてのフィールドの上に印刷される最後のものであったためです。
例
このコードを実行すると、次の結果が得られます-
出力
フォームフィード
次の例では、各フィールドの印刷後にフォームフィードを使用しています。
例
このコードを実行すると、次の結果が得られます-
- 出力 *
フォーマット指定子
C言語と同様に、AWKにもフォーマット指定子があります。 printfステートメントのAWKバージョンは、次の変換仕様形式を受け入れます-
%c
単一の文字を印刷します。* %c *に使用される引数が数値の場合、文字として扱われ、出力されます。 それ以外の場合、引数は文字列であると見なされ、その文字列の最初の文字のみが出力されます。
例
出力
このコードを実行すると、次の結果が得られます-
%dおよび%i
10進数の整数部分のみを出力します。
例
このコードを実行すると、次の結果が得られます-
出力
%eおよび%E
[-] d.dddddde [+-] ddの形式の浮動小数点数を出力します。
例
このコードを実行すると、次の結果が得られます-
出力
%E *形式では、eの代わりに *E が使用されます。
例
このコードを実行すると、次の結果が得られます-
出力
%f
[-] ddd.ddddddの形式の浮動小数点数を出力します。
例
このコードを実行すると、次の結果が得られます-
出力
%gおよび%G
%eまたは%f変換のいずれか短い方を使用します。有意でないゼロは抑制されます。
例
出力
このコードを実行すると、次の結果が得られます-
%G *形式は、%eの代わりに%E *を使用します。
例
このコードを実行すると、次の結果が得られます-
出力
%o
符号なしの8進数を出力します。
例
このコードを実行すると、次の結果が得られます-
出力
%u
符号なしの10進数を出力します。
例
このコードを実行すると、次の結果が得られます-
出力
%s
文字列を出力します。
例
このコードを実行すると、次の結果が得られます-
- 出力 *
%xおよび%X
符号なしの16進数を出力します。* %X *形式では、小文字ではなく大文字が使用されます。
例
このコードを実行すると、次の結果が得られます-
出力
今%Xを使用して結果を観察しましょう-
例
このコードを実行すると、次の結果が得られます-
出力
%%
単一の*%*文字を出力し、引数は変換されません。
例
このコードを実行すると、次の結果が得られます-
出力
%のオプションパラメータ
- %*を使用すると、次のオプションパラメータを使用できます-
幅
フィールドは width に埋め込まれます。 デフォルトでは、フィールドにはスペースが埋め込まれますが、0フラグが使用されると、ゼロが埋め込まれます。
例
このコードを実行すると、次の結果が得られます-
出力
先行ゼロ
先行ゼロはフラグとして機能し、出力にスペースではなくゼロを埋め込む必要があることを示します。 このフラグは、フィールドが印刷される値よりも広い場合にのみ効果があることに注意してください。 次の例ではこれについて説明します-
例
このコードを実行すると、次の結果が得られます-
出力
左揃え
式はそのフィールド内で左寄せする必要があります。 入力文字列が指定された文字数よりも少なく、左揃えにする場合、つまり、右側にスペースを追加する場合は、%の直後で数字の前にマイナス記号(–)を使用します。
次の例では、AWKコマンドの出力がcatコマンドにパイプされて、END OF LINE($)文字が表示されます。
例
このコードを実行すると、次の結果が得られます-
出力
プレフィックス記号
値が正の場合でも、常に数値の前に符号を付けます。
例
このコードを実行すると、次の結果が得られます-
出力
Hash
%oの場合、先行ゼロを提供します。 %xおよび%Xの場合、結果がゼロ以外の場合にのみ、それぞれ先頭の0xまたは0Xを提供します。 %e、%E、%f、および%Fの場合、結果には常に小数点が含まれます。 %gおよび%Gの場合、末尾のゼロは結果から削除されません。 次の例ではこれについて説明します-
例
このコードを実行すると、次の結果が得られます-
出力