Awk-quick-guide

提供:Dev Guides
移動先:案内検索

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にインストールします-

[jeryy]$ sudo apt-get update
[jeryy]$ sudo apt-get install gawk

同様に、RPMベースのGNU/LinuxにAWKをインストールするには、次のようにYellowdog Updator Modifier yum パッケージマネージャーを使用します-

[root]# yum install gawk

インストール後、コマンドラインからAWKにアクセスできることを確認してください。

[jerry]$ which awk

上記のコードを実行すると、次の結果が得られます-

/usr/bin/awk

ソースコードからのインストール

GNU AWKはGNUプロジェクトの一部であるため、そのソースコードは無料でダウンロードできます。 パッケージマネージャーを使用してAWKをインストールする方法は既に説明しました。 ソースコードからAWKをインストールする方法を理解しましょう。

次のインストールは、すべてのGNU/Linuxソフトウェア、および他のほとんどの自由に利用可能なプログラムにも適用できます。 ここにインストール手順があります-

ステップ1 *-本物の場所からソースコードをダウンロードします。 コマンドラインユーティリティ *wget は、この目的に役立ちます。

[jerry]$ wget http://ftp.gnu.org/gnu/gawk/gawk-4.1.1.tar.xz
  • ステップ2 *-ダウンロードしたソースコードを解凍して抽出します。
[jerry]$ tar xvf gawk-4.1.1.tar.xz
  • ステップ3 *-ディレクトリに移動し、configureを実行します。
[jerry]$ ./configure

ステップ4 *-正常に完了すると、 *configure はMakefileを生成します。 ソースコードをコンパイルするには、 make コマンドを発行します。

[jerry]$ make
  • ステップ5 *-テストスイートを実行して、ビルドがクリーンであることを確認できます。 これはオプションの手順です。
[jerry]$ make check
  • ステップ6 *-最後に、AWKをインストールします。 スーパーユーザー権限を持っていることを確認してください。
[jerry]$ sudo make install

それだ! AWKが正常にコンパイルおよびインストールされました。 次のように awk コマンドを実行してそれを確認します-

[jerry]$ which awk

このコードを実行すると、次の結果が得られます-

/usr/bin/awk

AWK-ワークフロー

エキスパートのAWKプログラマになるには、その内部を知る必要があります。 AWKは、読み取り、実行、繰り返しという単純なワークフローに従います。 次の図は、AWKのワークフローを示しています-

AWKワークフロー

Read

AWKは、入力ストリーム(ファイル、パイプ、またはstdin)から行を読み取り、メモリに保存します。

実行する

すべてのAWKコマンドは入力に順番に適用されます。 デフォルトでは、AWKはすべての行でコマンドを実行します。 パターンを提供することでこれを制限できます。

繰り返す

このプロセスは、ファイルが最後に達するまで繰り返されます。

プログラム構成

ここで、AWKのプログラム構造を理解しましょう。

BEGINブロック

BEGINブロックの構文は次のとおりです-

構文

BEGIN {awk-commands}

BEGINブロックは、プログラムの起動時に実行されます。 一度だけ実行されます。 これは変数を初期化するのに適した場所です。 BEGINはAWKキーワードであるため、大文字でなければなりません。 このブロックはオプションであることに注意してください。

ボディブロック

本体ブロックの構文は次のとおりです-

構文

/pattern/{awk-commands}

bodyブロックは、すべての入力行にAWKコマンドを適用します。 デフォルトでは、AWKはすべての行でコマンドを実行します。 パターンを提供することでこれを制限できます。 Bodyブロックにはキーワードがないことに注意してください。

ENDブロック

ENDブロックの構文は次のとおりです-

構文

END {awk-commands}

ENDブロックは、プログラムの最後に実行されます。 ENDはAWKキーワードであるため、大文字でなければなりません。 このブロックはオプションであることに注意してください。

シリアル番号、生徒の名前、科目名、取得したマークの数を含むファイル marks.txt を作成しましょう。

1)  Amit    Physics  80
2)  Rahul   Maths    90
3)  Shyam   Biology  87
4)  Kedar   English  85
5)  Hari    History  89

AWKスクリプトを使用して、ヘッダー付きのファイルコンテンツを表示します。

[jerry]$ awk 'BEGIN{printf "Sr No\tName\tSub\tMarks\n"} {print}' marks.txt

このコードが実行されると、次の結果が生成されます-

出力

Sr No Name Sub Marks
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89

開始時に、AWKはBEGINブロックからヘッダーを出力します。 次にbodyブロックで、ファイルから行を読み取り、AWKの印刷コマンドを実行します。このコマンドは、コンテンツを標準出力ストリームに印刷するだけです。 このプロセスは、ファイルが最後に達するまで繰り返されます。

AWK-基本構文

AWKは使いやすいです。 AWKコマンドは、コマンドラインから直接、またはAWKコマンドを含むテキストファイルの形式で提供できます。

AWKコマンドライン

次のように、コマンドラインで一重引用符で囲まれたAWKコマンドを指定できます-

awk [options] file ...

次の内容を持つテキストファイル marks.txt を検討してください-

1) Amit     Physics    80
2) Rahul    Maths      90
3) Shyam    Biology    87
4) Kedar    English    85
5) Hari     History    89

次のようにAWKを使用してファイルの完全なコンテンツを表示しましょう-

[jerry]$ awk '{print}' marks.txt

このコードを実行すると、次の結果が得られます-

出力

1) Amit     Physics    80
2) Rahul    Maths      90
3) Shyam    Biology    87
4) Kedar    English    85
5) Hari     History    89

AWKプログラムファイル

次のように、スクリプトファイルでAWKコマンドを提供できます-

awk [options] -f file ....

まず、以下に示すようにAWKコマンドを含むテキストファイル command.awk を作成します-

{print}

これで、テキストファイルからコマンドを読み取り、アクションを実行するようにAWKに指示できます。 ここで、上記の例で示したのと同じ結果が得られます。

[jerry]$ awk -f command.awk marks.txt

このコードを実行すると、次の結果が得られます-

出力

1) Amit  Physics 80
2) Rahul Maths   90
3) Shyam Biology 87
4) Kedar English 85
5) Hari  History 89

AWK標準オプション

AWKは、コマンドラインから提供できる次の標準オプションをサポートしています。

-vオプション

このオプションは、変数に値を割り当てます。 プログラムの実行前に割り当てることができます。 次の例は、-vオプションの使用法を説明しています。

[jerry]$ awk -v name=Jerry 'BEGIN{printf "Name = %s\n", name}'

このコードを実行すると、次の結果が得られます-

出力

Name = Jerry

--dump-variables [= file]オプション

グローバル変数とその最終値のソートされたリストをファイルに出力します。 デフォルトのファイルは awkvars.out です。

[jerry]$ awk --dump-variables ''
[jerry]$ cat awkvars.out

上記のコードを実行すると、次の結果が得られます-

出力

ARGC: 1
ARGIND: 0
ARGV: array, 1 elements
BINMODE: 0
CONVFMT: "%.6g"
ERRNO: ""
FIELDWIDTHS: ""
FILENAME: ""
FNR: 0
FPAT: "[^[:space:]]+"
FS: " "
IGNORECASE: 0
LINT: 0
NF: 0
NR: 0
OFMT: "%.6g"
OFS: " "
ORS: "\n"
RLENGTH: 0
RS: "\n"
RSTART: 0
RT: ""
SUBSEP: "\034"
TEXTDOMAIN: "messages"

--helpオプション

このオプションは、標準出力にヘルプメッセージを出力します。

[jerry]$ awk --help

このコードを実行すると、次の結果が得られます-

出力

Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
Usage: awk [POSIX or GNU style options] [--] 'program' file ...
POSIX options : GNU long options: (standard)
   -f progfile                --file=progfile
   -F fs                      --field-separator=fs
   -v var=val                 --assign=var=val
Short options : GNU long options: (extensions)
   -b                         --characters-as-bytes
   -c                         --traditional
   -C                         --copyright
   -d[file]                   --dump-variables[=file]
   -e 'program-text'          --source='program-text'
   -E file                    --exec=file
   -g                         --gen-pot
   -h                         --help
   -L [fatal]                 --lint[=fatal]
   -n                         --non-decimal-data
   -N                         --use-lc-numeric
   -O                         --optimize
   -p[file]                   --profile[=file]
   -P                         --posix
   -r                         --re-interval
   -S                         --sandbox
   -t                         --lint-old
   -V                         --version

--lint [= fatal]オプション

このオプションは、移植性のない、または疑わしい構成のチェックを可能にします。 引数 fatal を指定すると、警告メッセージがエラーとして扱われます。 次の例はこれを示しています-

[jerry]$ awk --lint ''/bin/ls

このコードを実行すると、次の結果が得られます-

出力

awk: cmd. line:1: warning: empty program text on command line
awk: cmd. line:1: warning: source file does not end in newline
awk: warning: no program text at all!

--posixオプション

このオプションは、厳密なPOSIX互換性を有効にします。この場合、一般的な拡張機能とgawk固有の拡張機能はすべて無効になります。

--profile [= file]オプション

このオプションは、ファイルにプログラムのきれいに印刷されたバージョンを生成します。 デフォルトのファイルは awkprof.out です。 以下の簡単な例はこれを示しています-

[jerry]$ awk --profile 'BEGIN{printf"---|Header|--\n"} {print}
END{printf"---|Footer|---\n"}' marks.txt >/dev/null
[jerry]$ cat awkprof.out

このコードを実行すると、次の結果が得られます-

出力

# gawk profile, created Sun Oct 26 19:50:48 2014

   # BEGIN block(s)

   BEGIN {
      printf "---|Header|--\n"
   }

   # Rule(s) {
      print $0
   }

   # END block(s)

   END {
      printf "---|Footer|---\n"
   }

--traditionalオプション

このオプションは、すべてのgawk固有の拡張機能を無効にします。

--versionオプション

このオプションは、AWKプログラムのバージョン情報を表示します。

[jerry]$ awk --version

このコードが実行されると、次の結果が生成されます-

出力

GNU Awk 4.0.1
Copyright (C) 1989, 1991-2012 Free Software Foundation.

AWK-基本的な例

この章では、いくつかの便利なAWKコマンドとその適切な例を説明します。 テキストファイル marks.txt が次の内容で処理されることを考慮してください-

1) Amit     Physics   80
2) Rahul    Maths     90
3) Shyam    Biology   87
4) Kedar    English   85
5) Hari     History   89

列またはフィールドの印刷

入力フィールドの特定の列のみを印刷するようにAWKに指示できます。 次の例はこれを示しています-

[jerry]$ awk '{print $3 "\t" $4}' marks.txt

このコードを実行すると、次の結果が得られます-

出力

Physics   80
Maths     90
Biology   87
English   85
History   89

ファイル marks.txt の3番目の列にはサブジェクト名が含まれ、4番目の列には特定のサブジェクトで取得されたマークが含まれます。 AWK印刷コマンドを使用して、これら2つの列を印刷します。 上記の例では、 $ 3と$ 4 はそれぞれ入力レコードの3番目と4番目のフィールドを表します。

すべての行を印刷する

デフォルトでは、AWKはパターンに一致するすべての行を印刷します。

[jerry]$ awk '/a/{print $0}' marks.txt

このコードを実行すると、次の結果が得られます-

出力

2) Rahul    Maths     90
3) Shyam    Biology   87
4) Kedar    English   85
5) Hari     History   89

上記の例では、フォームパターン a を検索しています。 パターンマッチが成功すると、ボディブロックからコマンドを実行します。 本体ブロックがない場合-レコードを印刷するデフォルトのアクションが実行されます。 したがって、次のコマンドは同じ結果を生成します-

[jerry]$ awk '/a/' marks.txt

パターンによる列の印刷

パターンマッチが成功すると、AWKはデフォルトでレコード全体を印刷します。 ただし、特定のフィールドのみを印刷するようにAWKに指示できます。 たとえば、次の例では、パターンマッチが成功したときに3番目と4番目のフィールドを出力します。

[jerry]$ awk '/a/{print $3 "\t" $4}' marks.txt

このコードを実行すると、次の結果が得られます-

出力

Maths    90
Biology  87
English  85
History  89

任意の順序で列を印刷する

列は任意の順序で印刷できます。 たとえば、次の例では、4番目の列に続いて3番目の列が出力されます。

[jerry]$ awk '/a/{print $4 "\t" $3}' marks.txt

上記のコードを実行すると、次の結果が得られます-

出力

90   Maths
87   Biology
85   English
89   History

一致したパターンのカウントと印刷

パターンマッチが成功した行の数を数えて印刷できる例を見てみましょう。

[jerry]$ awk '/a/{++cnt} END {print "Count = ", cnt}' marks.txt

このコードを実行すると、次の結果が得られます-

出力

Count = 4

この例では、パターンマッチが成功したときにcounterの値をインクリメントし、この値をENDブロックに出力します。 他のプログラミング言語とは異なり、変数を使用する前に宣言する必要はありません。

18文字以上の行を印刷する

18文字を超える行のみを印刷してみましょう。

[jerry]$ awk 'length($0) > 18' marks.txt

このコードを実行すると、次の結果が得られます-

出力

3) Shyam   Biology   87
4) Kedar   English   85

AWKは、文字列の長さを返す組み込みの length 関数を提供します。 $ 0 変数は行全体を格納し、ボディブロックがない場合、デフォルトアクション、つまり印刷アクションが実行されます。 したがって、行に18文字を超える文字が含まれている場合、比較結果はtrueになり、行が印刷されます。

AWK-組み込み変数

AWKはいくつかの組み込み変数を提供します。 AWKスクリプトの作成中に重要な役割を果たします。 この章では、組み込み変数の使用方法を示します。

標準AWK変数

標準のAWK変数については、以下で説明します。

ARGC

コマンドラインで提供される引数の数を意味します。

[jerry]$ awk 'BEGIN {print "Arguments =", ARGC}' One Two Three Four

このコードを実行すると、次の結果が得られます-

出力

Arguments = 5

しかし、4つの引数のみを渡したときにAWKが5と表示するのはなぜですか? 次の例を確認して、疑問を解決してください。

ARGV

コマンドライン引数を格納する配列です。 配列の有効なインデックスの範囲は0〜ARGC-1です。

[jerry]$ awk 'BEGIN {
   for (i = 0; i < ARGC - 1; ++i) {
      printf "ARGV[%d] = %s\n", i, ARGV[i]
   }
}' one two three four

このコードを実行すると、次の結果が得られます-

出力

ARGV[0] = awk
ARGV[1] = one
ARGV[2] = two
ARGV[3] = three

CONVFMT

数値の変換形式を表します。 デフォルト値は*%。6g *です。

[jerry]$ awk 'BEGIN { print "Conversion Format =", CONVFMT }'

このコードを実行すると、次の結果が得られます-

出力

Conversion Format = %.6g

エンビロン

環境変数の連想配列です。

[jerry]$ awk 'BEGIN { print ENVIRON["USER"] }'

このコードを実行すると、次の結果が得られます-

出力

jerry

他の環境変数の名前を見つけるには、 env コマンドを使用します。

ファイル名

現在のファイル名を表します。

[jerry]$ awk 'END {print FILENAME}' marks.txt

このコードを実行すると、次の結果が得られます-

  • 出力 *
marks.txt

FILENAMEはBEGINブロックでは定義されていないことに注意してください。

FS

(入力)フィールドセパレーターを表し、デフォルト値はスペースです。* -F *コマンドラインオプションを使用してこれを変更することもできます。

[jerry]$ awk 'BEGIN {print "FS = " FS}' | cat -vte

このコードを実行すると、次の結果が得られます-

出力

FS =  $

NF

現在のレコードのフィールドの数を表します。 たとえば、次の例では、3つ以上のフィールドを含む行のみを印刷します。

[jerry]$ echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NF > 2'

このコードを実行すると、次の結果が得られます-

出力

One Two Three
One Two Three Four

NR

現在のレコードの番号を表します。 たとえば、現在のレコード番号が3未満の場合、次の例はレコードを印刷します。

[jerry]$ echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NR < 3'

このコードを実行すると、次の結果が得られます-

出力

One Two
One Two Three

FNR

NRに似ていますが、現在のファイルに対して相対的です。 AWKが複数のファイルで動作している場合に便利です。 FNRの値は新しいファイルでリセットされます。

OFMT

出力形式番号を表し、デフォルト値は*%。6g *です。

[jerry]$ awk 'BEGIN {print "OFMT = " OFMT}'

このコードを実行すると、次の結果が得られます-

出力

OFMT = %.6g

OFS

出力フィールドの区切り文字を表し、デフォルト値はスペースです。

[jerry]$ awk 'BEGIN {print "OFS = " OFS}' | cat -vte

このコードを実行すると、次の結果が得られます-

出力

OFS =  $

ORS

出力レコードの区切りを表し、デフォルト値は改行です。

[jerry]$ awk 'BEGIN {print "ORS = " ORS}' | cat -vte

上記のコードを実行すると、次の結果が得られます-

出力

ORS = $
$

RLENGTH

*match* 関数で一致した文字列の長さを表します。 AWKの一致関数は、input-stringで特定の文字列を検索します。

[jerry]$ awk 'BEGIN { if (match("One Two Three", "re")) { print RLENGTH } }'

このコードを実行すると、次の結果が得られます-

出力

2

RS

(入力)レコード区切り文字を表し、デフォルト値は改行です。

[jerry]$ awk 'BEGIN {print "RS = " RS}' | cat -vte

このコードを実行すると、次の結果が得られます-

出力

RS = $
$

RSTART

これは、 match 関数で一致した文字列の最初の位置を表します。

[jerry]$ awk 'BEGIN { if (match("One Two Three", "Thre")) { print RSTART } }'

このコードを実行すると、次の結果が得られます-

出力

9

サブセップ

配列添え字の区切り文字を表し、デフォルト値は \ 034 です。

[jerry]$ awk 'BEGIN { print "SUBSEP = " SUBSEP }' | cat -vte

このコードを実行すると、次の結果が得られます-

出力

SUBSEP = ^\$

$0

入力レコード全体を表します。

[jerry]$ awk '{print $0}' marks.txt

このコードを実行すると、次の結果が得られます-

出力

1) Amit     Physics   80
2) Rahul    Maths     90
3) Shyam    Biology   87
4) Kedar    English   85
5) Hari     History   89

$n

フィールドがFSで区切られている現在のレコードのn ^ th ^フィールドを表します。

[jerry]$ awk '{print $3 "\t" $4}' marks.txt

このコードを実行すると、次の結果が得られます-

出力

Physics   80
Maths     90
Biology   87
English   85
History   89

GNU AWK固有の変数

GNU AWK固有の変数は次のとおりです-

アージンド

これは、処理中の現在のファイルのARGVのインデックスを表します。

[jerry]$ awk '{
   print "ARGIND   = ", ARGIND; print "Filename = ", ARGV[ARGIND]
}' junk1 junk2 junk3

このコードを実行すると、次の結果が得られます-

  • 出力 *
ARGIND   =  1
Filename =  junk1
ARGIND   =  2
Filename =  junk2
ARGIND   =  3
Filename =  junk3

BINMODE

非POSIXシステム上のすべてのファイルI/Oにバイナリモードを指定するために使用されます。 1、2、または3の数値は、それぞれ入力ファイル、出力ファイル、またはすべてのファイルがバイナリI/Oを使用することを指定します。* r または *w の文字列値は、それぞれ入力ファイルまたは出力ファイルがバイナリI/Oを使用することを指定します。 rw または wr の文字列値は、すべてのファイルがバイナリI/Oを使用することを指定します。

ERRNO

文字列は、 getline のリダイレクトが失敗した場合、または close 呼び出しが失敗した場合のエラーを示します。

[jerry]$ awk 'BEGIN { ret = getline < "junk.txt"; if (ret == -1) print "Error:", ERRNO }'

このコードを実行すると、次の結果が得られます-

出力

Error: No such file or directory

FIELDWIDTHS

フィールド幅変数のスペース区切りリストが設定され、GAWKはFS変数の値をフィールド区切り文字として使用する代わりに、入力を固定幅のフィールドに解析します。

無視

この変数が設定されると、GAWKは大文字と小文字を区別しなくなります。 次の例はこれを示しています-

[jerry]$ awk 'BEGIN{IGNORECASE = 1}/amit/' marks.txt

このコードを実行すると、次の結果が得られます-

出力

1) Amit  Physics   80

LINT

GAWKプログラムからの*-lint オプションの動的制御を提供します。 この変数が設定されると、GAWKはlint警告を出力します。 文字列値fatalを割り当てると、lint警告は-lint = fatal *とまったく同じように致命的なエラーになります。

[jerry]$ awk 'BEGIN {LINT = 1; a}'

このコードを実行すると、次の結果が得られます-

出力

awk: cmd. line:1: warning: reference to uninitialized variable `a'
awk: cmd. line:1: warning: statement has no effect

PROCINFO

これは、実および有効なUID番号、プロセスID番号など、プロセスに関する情報を含む連想配列です。

[jerry]$ awk 'BEGIN { print PROCINFO["pid"] }'

このコードを実行すると、次の結果が得られます-

出力

4316

テキストドメイン

AWKプログラムのテキストドメインを表します。 プログラムの文字列のローカライズされた翻訳を見つけるために使用されます。

[jerry]$ awk 'BEGIN { print TEXTDOMAIN }'

このコードを実行すると、次の結果が得られます-

出力

messages

上記の出力は、 en_IN ロケールによる英語のテキストを示しています

AWK-演算子

他のプログラミング言語と同様に、AWKも多数の演算子を提供します。 この章では、AWKオペレーターと適切な例を説明します。

S.No. Operators & Description
1

Arithmetic Operators

AWKは次の算術演算子をサポートしています。

2

Increment and Decrement Operators

AWKは、次のインクリメント演算子とデクリメント演算子をサポートしています。

3

Assignment Operators

AWKは次の代入演算子をサポートしています。

4

Relational Operators

AWKは次の関係演算子をサポートしています。

5

Logical Operators

AWKは次の論理演算子をサポートしています。

6

Ternary Operator

三項演算子を使用して条件式を簡単に実装できます。

7

Unary Operators

AWKは次の単項演算子をサポートしています。

8

Exponential Operators

指数演算子には2つの形式があります。

9

String Concatenation Operator

スペースは、2つの文字列を結合する文字列連結演算子です。

10

Array Membership Operator

  • in* で表されます。 配列要素にアクセスするときに使用されます。
11

Regular Expression Operators

この例では、2つの形式の正規表現演算子について説明します。

AWK-正規表現

AWKは、正規表現の処理において非常に強力で効率的です。 単純な正規表現を使用すると、多くの複雑なタスクを解決できます。 コマンドラインのエキスパートなら誰でも、正規表現の力を知っています。

この章では、標準の正規表現と適切な例を取り上げます。

Dot

行末文字を除く任意の単一文字に一致します。 たとえば、次の例は fin、fun、fan などに一致します。

[jerry]$ echo -e "cat\nbat\nfun\nfin\nfan" | awk '/f.n/'

上記のコードを実行すると、次の結果が得られます-

出力

fun
fin
fan

行頭

行頭と一致します。 たとえば、次の例は、パターン The で始まるすべての行を出力します。

[jerry]$ echo -e "This\nThat\nThere\nTheir\nthese" | awk '/^The/'

このコードを実行すると、次の結果が得られます-

出力

There
Their

行末

行末に一致します。 たとえば、次の例では、文字 n で終わる行を印刷します。

[jerry]$ echo -e "knife\nknow\nfun\nfin\nfan\nnine" | awk '/n$/'

出力

このコードを実行すると、次の結果が得られます-

fun
fin
fan

一致する文字セット

これは、複数の文字のうち1つだけを照合するために使用されます。 たとえば、次の例はパターン Call および Tall に一致しますが、 Ball には一致しません。

[jerry]$ echo -e "Call\nTall\nBall" | awk '/[CT]all/'

出力

このコードを実行すると、次の結果が得られます-

Call
Tall

専用セット

排他セットでは、カラットは角括弧内の文字セットを無効にします。 たとえば、次の例では Ball のみが出力されます。

[jerry]$ echo -e "Call\nTall\nBall" | awk '/[^CT]all/'

このコードを実行すると、次の結果が得られます-

出力

Ball

変更

垂直バーを使用すると、正規表現を論理的にOR演算できます。 たとえば、次の例では、 Ball および Call が出力されます。

[jerry]$ echo -e "Call\nTall\nBall\nSmall\nShall" | awk '/Call|Ball/'

このコードを実行すると、次の結果が得られます-

出力

Call
Ball

ゼロまたは1つの発生

直前の文字のゼロまたは1回の出現に一致します。 たとえば、次の例は ColorColor に一致します。 ?*を使用して、オプション文字として *u を作成しました。

[jerry]$ echo -e "Colour\nColor" | awk '/Colou?r/'

このコードを実行すると、次の結果が得られます-

出力

Colour
Color

ゼロ以上の発生

直前の文字の0回以上の出現に一致します。 たとえば、次の例は* ca、cat、catt、*などに一致します。

[jerry]$ echo -e "ca\ncat\ncatt" | awk '/cat*/'

このコードを実行すると、次の結果が得られます-

出力

ca
cat
catt

1つ以上の発生

直前の文字の1回以上の出現に一致します。 たとえば、以下の例は、1つ以上の 2 の出現に一致します。

[jerry]$ echo -e "111\n22\n123\n234\n456\n222"  | awk '/2+/'

上記のコードを実行すると、次の結果が得られます-

出力

22
123
234
222

グルーピング

括弧()*はグループ化と文字|に使用されます。は代替に使用されます。 たとえば、次の正規表現は、 *Apple JuiceまたはApple Cake を含む行に一致します。

[jerry]$ echo -e "Apple Juice\nApple Pie\nApple Tart\nApple Cake" | awk
   '/Apple (Juice|Cake)/'

このコードを実行すると、次の結果が得られます-

出力

Apple Juice
Apple Cake

AWK-配列

AWKには連想配列があり、それに関する最も良いことの1つは、インデックスが連続した数字のセットである必要がないことです。文字列または数値のいずれかを配列インデックスとして使用できます。 また、事前に配列のサイズを宣言する必要はありません。配列は実行時に拡大/縮小できます。

その構文は次のとおりです-

構文

array_name[index] = value

ここで、 array_name は配列の名前、 index は配列のインデックス、 value は配列の要素に割り当てる値です。

配列の作成

配列についてより深く理解するために、配列の要素を作成してアクセスしてみましょう。

[jerry]$ awk 'BEGIN {
   fruits["mango"] = "yellow";
   fruits["orange"] = "orange"
   print fruits["orange"] "\n" fruits["mango"]
}'

このコードを実行すると、次の結果が得られます-

出力

orange
yellow

上記の例では、配列を fruits として宣言します。そのインデックスはフルーツ名で、値はフルーツの色です。 配列要素にアクセスするには、 array_name [index] 形式を使用します。

配列要素の削除

挿入には、代入演算子を使用しました。 同様に、 delete ステートメントを使用して、配列から要素を削除できます。 削除ステートメントの構文は次のとおりです-

構文

delete array_name[index]

次の例では、要素 orange を削除します。 したがって、コマンドは出力を表示しません。

[jerry]$ awk 'BEGIN {
   fruits["mango"] = "yellow";
   fruits["orange"] = "orange";
   delete fruits["orange"];
   print fruits["orange"]
}'

多次元配列

AWKは1次元配列のみをサポートします。 ただし、1次元配列自体を使用して、多次元配列を簡単にシミュレートできます。

たとえば、以下は3x3の2次元配列です-

100   200   300
400   500   600
700   800   900

上記の例では、array [0] [0]は100を格納し、array [0] [1]は200を格納します。 配列の場所[0] [0]に100を格納するには、次の構文を使用できます-

構文

array["0,0"] = 100

インデックスとして 0,0 を指定しましたが、これらは2つのインデックスではありません。 実際には、これはストリング 0,0 を持つ1つのインデックスにすぎません。

次の例は、2D配列をシミュレートします-

[jerry]$ awk 'BEGIN {
   array["0,0"] = 100;
   array["0,1"] = 200;
   array["0,2"] = 300;
   array["1,0"] = 400;
   array["1,1"] = 500;
   array["1,2"] = 600;

   # print array elements
   print "array[0,0] = " array["0,0"];
   print "array[0,1] = " array["0,1"];
   print "array[0,2] = " array["0,2"];
   print "array[1,0] = " array["1,0"];
   print "array[1,1] = " array["1,1"];
   print "array[1,2] = " array["1,2"];
}'

このコードを実行すると、次の結果が得られます-

出力

array[0,0] = 100
array[0,1] = 200
array[0,2] = 300
array[1,0] = 400
array[1,1] = 500
array[1,2] = 600

要素/インデックスの並べ替えなど、配列に対してさまざまな操作を実行することもできます。 そのために、 assort および asorti 関数を使用できます

AWK-制御フロー

他のプログラミング言語と同様に、AWKはプログラムのフローを制御する条件ステートメントを提供します。 この章では、AWKの制御ステートメントと適切な例を説明します。

ifステートメント

単純に条件をテストし、条件に応じて特定のアクションを実行します。 以下に示すのは、 if ステートメントの構文です-

構文

if (condition)
   action

また、以下に示すように中括弧のペアを使用して複数のアクションを実行することもできます-

構文

if (condition) {
   action-1
   action-1
   .
   .
   action-n
}

たとえば、次の例では、数値が偶数かどうかを確認します-

[jerry]$ awk 'BEGIN {num = 10; if (num % 2 == 0) printf "%d is even number.\n", num }'

上記のコードを実行すると、次の結果が得られます-

出力

10 is even number.

If Elseステートメント

*if-else* 構文では、条件がfalseになったときに実行されるアクションのリストを提供できます。
*if-else* ステートメントの構文は次のとおりです-

構文

if (condition)
   action-1
else
   action-2

上記の構文では、条件がtrueと評価されるとaction-1が実行され、条件がfalseと評価されるとaction-2が実行されます。 たとえば、次の例では、数値が偶数かどうかを確認します-

[jerry]$ awk 'BEGIN {
   num = 11; if (num % 2 == 0) printf "%d is even number.\n", num;
      else printf "%d is odd number.\n", num
}'

このコードを実行すると、次の結果が得られます-

出力

11 is odd number.

If-Else-Ifラダー

複数の if-else ステートメントを使用して、 if-else-if ラダーを簡単に作成できます。 次の例はこれを示しています-

[jerry]$ awk 'BEGIN {
   a = 30;

   if (a==10)
   print "a = 10";
   else if (a == 20)
   print "a = 20";
   else if (a == 30)
   print "a = 30";
}'

このコードを実行すると、次の結果が得られます-

出力

a = 30

AWK-ループ

この章では、AWKのループと適切な例を説明します。 ループは、一連のアクションを繰り返し実行するために使用されます。 ループ条件が真である限り、ループの実行が継続されます。

ループ用

*for* ループの構文は-

構文

for (initialization; condition; increment/decrement)
   action

最初に、 for ステートメントが初期化アクションを実行してから、条件をチェックします。 条件が真の場合、アクションを実行し、その後、インクリメントまたはデクリメント操作を実行します。 条件が真である限り、ループの実行が継続されます。 たとえば、次の例では、 for ループを使用して1〜5を出力します-

[jerry]$ awk 'BEGIN { for (i = 1; i <= 5; ++i) print i }'

このコードを実行すると、次の結果が得られます-

出力

1
2
3
4
5

Whileループ

*while* ループは、特定の論理条件がtrueと評価されるまでアクションを実行し続けます。 *while* ループの構文は次のとおりです-

構文

while (condition)
   action

AWKは最初に条件をチェックします。条件が真の場合、アクションを実行します。 このプロセスは、ループ条件がtrueと評価される限り繰り返されます。 たとえば、次の例では、 while ループを使用して1〜5を出力します-

[jerry]$ awk 'BEGIN {i = 1; while (i < 6) { print i; ++i } }'

このコードを実行すると、次の結果が得られます-

出力

1
2
3
4
5

Do-Whileループ

*do-while* ループは、ループの終わりにテスト条件が評価されることを除いて、whileループに似ています。 * *do-while* * loopの構文は次のとおりです-

構文

do
   action
while (condition)
*do-while* ループでは、条件ステートメントがfalseと評価された場合でも、アクションステートメントは少なくとも1回実行されます。 たとえば、次の例では、 *do-while* ループを使用して1〜5個の数字を出力します-

[jerry]$ awk 'BEGIN {i = 1; do { print i; ++i } while (i < 6) }'

このコードを実行すると、次の結果が得られます-

出力

1
2
3
4
5

ブレイクステートメント

その名前が示すように、ループの実行を終了するために使用されます。 合計が50を超えるとループを終了する例を次に示します。

[jerry]$ awk 'BEGIN {
   sum = 0; for (i = 0; i < 20; ++i) {
      sum += i; if (sum > 50) break; else print "Sum =", sum
   }
}'

このコードを実行すると、次の結果が得られます-

出力

Sum = 0
Sum = 1
Sum = 3
Sum = 6
Sum = 10
Sum = 15
Sum = 21
Sum = 28
Sum = 36
Sum = 45

声明を続ける

*continue* ステートメントはループ内で使用され、ループの次の反復にスキップします。 ループ内の一部のデータの処理をスキップする場合に便利です。 たとえば、次の例では、 *continue* ステートメントを使用して、1〜20の偶数を出力します。

[jerry]$ awk 'BEGIN {
   for (i = 1; i <= 20; ++i) {
      if (i % 2 == 0) print i ; else continue
   }
}'

このコードを実行すると、次の結果が得られます-

出力

2
4
6
8
10
12
14
16
18
20

終了ステートメント

スクリプトの実行を停止するために使用されます。 AWKプロセスの終了ステータスコードである整数を引数として受け入れます。 引数が指定されていない場合、 exit はステータス0を返します。 合計が50を超えると実行を停止する例を次に示します。

[jerry]$ awk 'BEGIN {
   sum = 0; for (i = 0; i < 20; ++i) {
      sum += i; if (sum > 50) exit(10); else print "Sum =", sum
   }
}'

出力

このコードを実行すると、次の結果が得られます-

Sum = 0
Sum = 1
Sum = 3
Sum = 6
Sum = 10
Sum = 15
Sum = 21
Sum = 28
Sum = 36
Sum = 45

スクリプトの戻りステータスを確認しましょう。

[jerry]$ echo $?

このコードを実行すると、次の結果が得られます-

出力

10

AWK-組み込み関数

AWKには、プログラマーが常に利用できる多くの関数が組み込まれています。 この章では、算術演算、文字列、時間、ビット操作、およびその他のさまざまな関数について、適切な例を挙げて説明します。

S.No. Built in functions & Description
1

Arithmetic Functions

AWKには、次の組み込みの算術関数があります。

2

String Functions

AWKには次の組み込み文字列関数があります。

3

Time Functions

AWKには、次の組み込みの時間関数があります。

4

Bit Manipulation Functions

AWKには、次の組み込みビット操作関数があります。

5

Miscellaneous Functions

AWKには、次のその他の機能があります。

AWK-ユーザー定義関数

関数は、プログラムの基本的な構成要素です。 AWKでは、独自の関数を定義できます。 大きなプログラムは機能に分割でき、各機能は個別に作成/テストできます。 コードの再利用性を提供します。

以下は、ユーザー定義関数の一般的な形式です-

構文

function function_name(argument1, argument2, ...) {
   function body
}

この構文では、 function_name はユーザー定義関数の名前です。 関数名は文字で始める必要があり、残りの文字は数字、アルファベット文字、またはアンダースコアの任意の組み合わせにすることができます。 AWKの予約語は関数名として使用できません。

関数は、コンマで区切られた複数の引数を受け入れることができます。 引数は必須ではありません。 引数なしでユーザー定義関数を作成することもできます。

  • 関数本体*は1つ以上のAWKステートメントで構成されます。

最小数と最大数を計算する2つの関数を作成し、これらの関数を main という別の関数から呼び出しましょう。 functions.awk ファイルには含まれています-

# Returns minimum number
function find_min(num1, num2){
   if (num1 < num2)
   return num1
   return num2
}
# Returns maximum number
function find_max(num1, num2){
   if (num1 > num2)
   return num1
   return num2
}
# Main function
function main(num1, num2){
   # Find minimum number
   result = find_min(10, 20)
   print "Minimum =", result

   # Find maximum number
   result = find_max(10, 20)
   print "Maximum =", result
}
# Script execution starts here
BEGIN {
   main(10, 20)
}

このコードを実行すると、次の結果が得られます-

出力

Minimum = 10
Maximum = 20

AWK-出力のリダイレクト

これまで、標準出力ストリームにデータを表示しました。 データをファイルにリダイレクトすることもできます。 print または printf ステートメントの後にリダイレクトが表示されます。 AWKのリダイレクトは、シェルコマンドのリダイレクトと同様に記述されますが、AWKプログラム内で記述される点が異なります。 この章では、適切な例を使用してリダイレクトについて説明します。

リダイレクト演算子

リダイレクト演算子の構文は次のとおりです-

構文

print DATA > output-file

データを output-file に書き込みます。 出力ファイルが存在しない場合は、作成します。 このタイプのリダイレクトを使用すると、最初の出力が書き込まれる前に出力ファイルが消去されます。 同じ出力ファイルへの後続の書き込み操作では、出力ファイルは消去されませんが、追加されます。 たとえば、次の例では、 Hello、World !!! をファイルに書き込みます。

いくつかのテキストデータを含むファイルを作成しましょう。

[jerry]$ echo "Old data" >/tmp/message.txt
[jerry]$ cat/tmp/message.txt

このコードを実行すると、次の結果が得られます-

出力

Old data

ここで、AWKのリダイレクト演算子を使用して、コンテンツをそこにリダイレクトします。

[jerry]$ awk 'BEGIN { print "Hello, World !!!" > "/tmp/message.txt" }'
[jerry]$ cat/tmp/message.txt

このコードを実行すると、次の結果が得られます-

出力

Hello, World !!!

演算子を追加

追加演算子の構文は次のとおりです-

構文

print DATA >> output-file

データを output-file に追加します。 出力ファイルが存在しない場合は、作成します。 このタイプのリダイレクトを使用すると、新しいコンテンツがファイルの最後に追加されます。 たとえば、次の例では、 Hello、World !!! をファイルに追加します。

いくつかのテキストデータを含むファイルを作成しましょう。

[jerry]$ echo "Old data" >/tmp/message.txt
[jerry]$ cat/tmp/message.txt

このコードを実行すると、次の結果が得られます-

出力

Old data

次に、AWKの追加演算子を使用して、コンテンツを追加します。

[jerry]$ awk 'BEGIN { print "Hello, World !!!" >> "/tmp/message.txt" }'
[jerry]$ cat/tmp/message.txt

このコードを実行すると、次の結果が得られます-

出力

Old data
Hello, World !!!

Pipe

ファイルを使用する代わりに、パイプを介して別のプログラムに出力を送信することができます。 このリダイレクトにより、コマンドへのパイプが開かれ、このパイプを介してアイテムの値が別のプロセスに書き込まれてコマンドが実行されます。 リダイレクト引数コマンドは、実際にはAWK式です。 パイプの構文は次のとおりです-

構文

print items | command
*tr* コマンドを使用して、小文字を大文字に変換します。

[jerry]$ awk 'BEGIN { print "hello, world !!!" | "tr [a-z] [A-Z]" }'

このコードを実行すると、次の結果が得られます-

出力

HELLO, WORLD !!!

双方向通信

AWKは、双方向通信である* |&を使用して外部プロセスと通信できます。 たとえば、次の例では *tr コマンドを使用して小文字を大文字に変換します。 私たちの command.awk ファイルには以下が含まれています-

BEGIN {
   cmd = "tr [a-z] [A-Z]"
   print "hello, world !!!" |& cmd
   close(cmd, "to")

   cmd |& getline out
   print out;
   close(cmd);
}

このコードを実行すると、次の結果が得られます-

出力

HELLO, WORLD !!!

スクリプトは不可解に見えますか? それを分かりやすく説明しましょう。

  • 最初のステートメント 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ステートメントの構文です-

構文

printf fmt, expr-list

上記の構文では、 fmt はフォーマット仕様と定数の文字列です。 expr-list は、書式指定子に対応する引数のリストです。

エスケープシーケンス

他の文字列と同様に、フォーマットには埋め込みエスケープシーケンスを含めることができます。 以下で説明するのは、AWKでサポートされるエスケープシーケンスです-

改行

次の例では、改行文字を使用して HelloWorld を別々の行に出力します-

[jerry]$ awk 'BEGIN { printf "Hello\nWorld\n" }'

このコードを実行すると、次の結果が得られます-

出力

Hello
World

水平タブ

次の例では、水平タブを使用して異なるフィールドを表示します-

[jerry]$ awk 'BEGIN { printf "Sr No\tName\tSub\tMarks\n" }'

上記のコードを実行すると、次の結果が得られます-

出力

Sr No   Name    Sub Marks

垂直タブ

次の例では、各フィールドの後に垂直タブを使用しています-

[jerry]$ awk 'BEGIN { printf "Sr No\vName\vSub\vMarks\n" }'

このコードを実行すると、次の結果が得られます-

出力

Sr No
   Name
      Sub
         Marks

バックスペース

次の例では、最後のフィールドを除くすべてのフィールドの後にバックスペースを出力します。 最初の3つのフィールドから最後の数字を消去します。 たとえば、最後の文字がバックスペースで消去されるため、 Field 1Field として表示されます。 ただし、 Field 4 の後に \ b がなかったため、最後のフィールド Field 4 がそのまま表示されます。

[jerry]$ awk 'BEGIN { printf "Field 1\bField 2\bField 3\bField 4\n" }'

このコードを実行すると、次の結果が得られます-

出力

Field Field Field Field 4

キャリッジリターン

次の例では、すべてのフィールドを印刷した後、 Carriage Return を実行し、現在の印刷値の上に次の値を印刷します。 これは、最終出力では Field 4 のみが表示されることを意味します。これは、前のすべてのフィールドの上に印刷される最後のものであったためです。

[jerry]$ awk 'BEGIN { printf "Field 1\rField 2\rField 3\rField 4\n" }'

このコードを実行すると、次の結果が得られます-

出力

Field 4

フォームフィード

次の例では、各フィールドの印刷後にフォームフィードを使用しています。

[jerry]$ awk 'BEGIN { printf "Sr No\fName\fSub\fMarks\n" }'

このコードを実行すると、次の結果が得られます-

  • 出力 *
Sr No
   Name
      Sub
         Marks

フォーマット指定子

C言語と同様に、AWKにもフォーマット指定子があります。 printfステートメントのAWKバージョンは、次の変換仕様形式を受け入れます-

%c

単一の文字を印刷します。* %c *に使用される引数が数値の場合、文字として扱われ、出力されます。 それ以外の場合、引数は文字列であると見なされ、その文字列の最初の文字のみが出力されます。

[jerry]$ awk 'BEGIN { printf "ASCII value 65 = character %c\n", 65 }'

出力

このコードを実行すると、次の結果が得られます-

ASCII value 65 = character A

%dおよび%i

10進数の整数部分のみを出力します。

[jerry]$ awk 'BEGIN { printf "Percentags = %d\n", 80.66 }'

このコードを実行すると、次の結果が得られます-

出力

Percentags = 80

%eおよび%E

[-] d.dddddde [+-] ddの形式の浮動小数点数を出力します。

[jerry]$ awk 'BEGIN { printf "Percentags = %E\n", 80.66 }'

このコードを実行すると、次の結果が得られます-

出力

Percentags = 8.066000e+01

%E *形式では、eの代わりに *E が使用されます。

[jerry]$ awk 'BEGIN { printf "Percentags = %e\n", 80.66 }'

このコードを実行すると、次の結果が得られます-

出力

Percentags = 8.066000E+01

%f

[-] ddd.ddddddの形式の浮動小数点数を出力します。

[jerry]$ awk 'BEGIN { printf "Percentags = %f\n", 80.66 }'

このコードを実行すると、次の結果が得られます-

出力

Percentags = 80.660000

%gおよび%G

%eまたは%f変換のいずれか短い方を使用します。有意でないゼロは抑制されます。

[jerry]$ awk 'BEGIN { printf "Percentags = %g\n", 80.66 }'

出力

このコードを実行すると、次の結果が得られます-

Percentags = 80.66

%G *形式は、%eの代わりに%E *を使用します。

[jerry]$ awk 'BEGIN { printf "Percentags = %G\n", 80.66 }'

このコードを実行すると、次の結果が得られます-

出力

Percentags = 80.66

%o

符号なしの8進数を出力します。

[jerry]$ awk 'BEGIN { printf "Octal representation of decimal number 10 = %o\n", 10}'

このコードを実行すると、次の結果が得られます-

出力

Octal representation of decimal number 10 = 12

%u

符号なしの10進数を出力します。

[jerry]$ awk 'BEGIN { printf "Unsigned 10 = %u\n", 10 }'

このコードを実行すると、次の結果が得られます-

出力

Unsigned 10 = 10

%s

文字列を出力します。

[jerry]$ awk 'BEGIN { printf "Name = %s\n", "Sherlock Holmes" }'

このコードを実行すると、次の結果が得られます-

  • 出力 *
Name = Sherlock Holmes

%xおよび%X

符号なしの16進数を出力します。* %X *形式では、小文字ではなく大文字が使用されます。

[jerry]$ awk 'BEGIN {
   printf "Hexadecimal representation of decimal number 15 = %x\n", 15
}'

このコードを実行すると、次の結果が得られます-

出力

Hexadecimal representation of decimal number 15 = f

今%Xを使用して結果を観察しましょう-

[jerry]$ awk 'BEGIN {
   printf "Hexadecimal representation of decimal number 15 = %X\n", 15
}'

このコードを実行すると、次の結果が得られます-

出力

Hexadecimal representation of decimal number 15 = F

%%

単一の*%*文字を出力し、引数は変換されません。

[jerry]$ awk 'BEGIN { printf "Percentags = %d%%\n", 80.66 }'

このコードを実行すると、次の結果が得られます-

出力

Percentags = 80%

%のオプションパラメータ

  • %*を使用すると、次のオプションパラメータを使用できます-

フィールドは width に埋め込まれます。 デフォルトでは、フィールドにはスペースが埋め込まれますが、0フラグが使用されると、ゼロが埋め込まれます。

[jerry]$ awk 'BEGIN {
   num1 = 10; num2 = 20; printf "Num1 = %10d\nNum2 = %10d\n", num1, num2
}'

このコードを実行すると、次の結果が得られます-

出力

Num1 =         10
Num2 =         20

先行ゼロ

先行ゼロはフラグとして機能し、出力にスペースではなくゼロを埋め込む必要があることを示します。 このフラグは、フィールドが印刷される値よりも広い場合にのみ効果があることに注意してください。 次の例ではこれについて説明します-

[jerry]$ awk 'BEGIN {
   num1 = -10; num2 = 20; printf "Num1 = %05d\nNum2 = %05d\n", num1, num2
}'

このコードを実行すると、次の結果が得られます-

出力

Num1 = -0010
Num2 = 00020

左揃え

式はそのフィールド内で左寄せする必要があります。 入力文字列が指定された文字数よりも少なく、左揃えにする場合、つまり、右側にスペースを追加する場合は、%の直後で数字の前にマイナス記号(–)を使用します。

次の例では、AWKコマンドの出力がcatコマンドにパイプされて、END OF LINE($)文字が表示されます。

[jerry]$ awk 'BEGIN { num = 10; printf "Num = %-5d\n", num }' | cat -vte

このコードを実行すると、次の結果が得られます-

出力

Num = 10   $

プレフィックス記号

値が正の場合でも、常に数値の前に符号を付けます。

[jerry]$ awk 'BEGIN {
   num1 = -10; num2 = 20; printf "Num1 = %+d\nNum2 = %+d\n", num1, num2
}'

このコードを実行すると、次の結果が得られます-

出力

Num1 = -10
Num2 = +20

Hash

%oの場合、先行ゼロを提供します。 %xおよび%Xの場合、結果がゼロ以外の場合にのみ、それぞれ先頭の0xまたは0Xを提供します。 %e、%E、%f、および%Fの場合、結果には常に小数点が含まれます。 %gおよび%Gの場合、末尾のゼロは結果から削除されません。 次の例ではこれについて説明します-

[jerry]$ awk 'BEGIN {
   printf "Octal representation = %#o\nHexadecimal representaion = %#X\n", 10, 10
}'

このコードを実行すると、次の結果が得られます-

出力

Octal representation = 012
Hexadecimal representation = 0XA