awkコマンド(テキストの加工やパターン処理をする)
- 〈このページの構成〉
形式
awk[-F 入力フィールドセパレータ][-v 変数名=変数値]... [-f スクリプトファイルのパス名|スクリプト] [[対象パス名...]|[組み込み変数名=変数値...]]...
機能
テキストファイル内の各行(以降,レコードと呼びます)に対して特定のパターンに一致する行を検索し,一致した行に対して指定した処理をします。
引数
- -F 入力フィールドセパレータ
-
入力フィールドセパレータの値を指定します。この指定値がawkコマンドの組み込み変数FSの値となります。
- -v 変数名=変数値
-
変数名とその値を指定します。変数名とその値は,-fオプションに指定したスクリプトファイルまたは引数に指定したスクリプトに渡されます。複数個指定できます。同じ変数名を複数回指定した場合,最後に指定した値が設定されます。
- -f スクリプトファイルのパス名
-
入力ファイルを検索するパターンおよびパターンと一致したレコードに対しての処理命令を記述したファイル(スクリプトファイル)のパス名を指定します。
-
パス名に「-」を指定した場合は,標準入力から入力します。
-
-fオプションは19個まで指定できます。
-
- スクリプト
-
入力ファイルを検索するパターンおよびパターンと一致したレコードに対しての処理命令を,引数として指定します。
- 対象パス名
-
処理対象とするファイルのパス名を指定します。複数指定できます。
パス名を指定しない,またはパス名に「-」を指定した場合は,標準入力から入力します。なお,BEGINパターンだけの実行の場合は,指定したファイルまたは標準入力からレコードは入力しません。
- 組み込み変数名=変数値
-
組み込み変数名およびその値を指定します。変数名とその値は,-fオプションに指定したスクリプトファイルまたは引数に指定したスクリプトに渡されます。
-
組み込み変数の説明に記述されていない名称を指定した場合は,-vオプションと同じになります。
-
すべての対象パス名の前に指定した場合は,BEGINパターン処理を除くすべてのファイル処理とENDパターン処理で有効となります。
-
すべての対象パス名のあとに指定した場合は,ENDパターン処理だけで有効となります。
-
対象パス名の間に指定した場合は,この指定以降のパス名の処理とENDパターン処理で有効となります。
-
スクリプト(パターンおよびアクション)
awkコマンドで実行するスクリプトの記述形式を次に示します。
[パターン][{[アクション]}]
パターンには,入力ファイルを検索するパターンを記述します。パターンに記述できる内容については,「パターンの種類」を参照してください。アクションには,パターンと一致したレコードに対しての処理命令を記述します。
入力ファイルから1レコードを入力するたびにパターンと比較し,パターンに一致した場合にアクションが実行されます。パターンを省略した場合は,すべてのレコードがアクション実行の対象となります。
アクションは,パターンと一致したレコードに対する制御文や関数を使用した処理を記述します。アクションには,制御文,組み込み関数,ユーザー定義関数,変数,または演算子を指定して動作を記述できます。処理は複数の文を記述でき,各文は改行またはセミコロンで区切ります。アクションを省略した場合,レコードの内容を標準出力に出力します。なお,{ }で囲んだ部分のアクションだけを省略した場合は,パターンと一致したレコードに対する処理は行われません。
コメントを記述する場合は,コメントの前に「#」を記述します。「#」以降から行末までをコメントとして扱います。
レコードとフィールド
レコードとは,入力レコードセパレータで分割した単位のことです。入力レコードセパレータの値は改行文字です。Windowsの場合,[CR]+[LF]または[LF]が改行文字と見なされます。UNIXの場合,[LF]が改行文字と見なされます。なお,UNIXの場合,入力ファイルの各レコードが[CR]+[LF]で区切られているときは,分割されたレコードには[CR]が含まれます。
入力レコードセパレータは,組み込み変数RSにレコードの区切りを示す1バイトの文字を設定することによって変更できます。文字列を指定した場合は,先頭の1文字を設定します。
レコードはフィールドセパレータによって,フィールドと呼ばれる単位に分割されます。フィールドセパレータのデフォルト値はスペースです。フィールドセパレータは-fオプションまたは組み込み変数FSにフィールドの区切りを示す文字列を設定することで変更できます。
アクションには,入力情報として入力ファイルから現在読み込んでいるレコードの内容およびレコードの各フィールドの値が渡されます。レコードの内容はフィールド変数の$0に格納されます。各フィールドの値は,レコードの最初のフィールドがフィールド変数$1,2番目のフィールドがフィールド変数$2というように順に格納されます。
パターンの種類
入力ファイルを検索するパターンには次の指定ができます。
- 文字列
-
フィールドまたはレコードから検索したい文字列をスラッシュ(/)で囲みます。指定する文字列には正規表現を使用できます。スラッシュ(/)自体を検索したい場合は,エスケープ文字(\)を使用します。「/\//」と指定します。
検索したい文字列に「hitachi」を指定する場合の例を次に示します。
/hitachi/{ (アクション) }
- 関係式
-
関係演算子(>,>=,<,<=,==,!=)を使用し,特定のフィールドに対して比較をします。指定例を次に示します。
レコードの2番目のフィールドの内容が「hitachi」の場合にアクションを実行します。
$2 == "hitachi"{ (アクション) }
- パターンの組み合わせ
-
複数のパターンを組み合わせてアクション実行条件を記述します。使用できる組み合わせを次の表に示します。
書式
説明
パターン1 && パターン2
論理積の演算子で,パターン1およびパターン2に一致するレコードをアクションの実行対象とします。
パターン1 || パターン2
論理和の演算子で,パターン1またはパターン2に一致するレコードをアクションの実行対象とします。
パターン1 ? パターン2 : パターン3
三項演算子で,パターン1とパターン2に一致するレコードまたはパターン3に一致するレコードをアクションの実行対象とします。
! パターン
否定の演算子で,パターンに一致しないレコードをアクションの実行対象とします。
(パターン)
複数条件のパターンをグループ化します。
パターン1, パターン2
パターン1に一致するレコードから,パターン2に一致するレコードまでがアクションの実行範囲となります。なお,パターン2に指定したレコードがなく入力ファイルの終端に達した場合は,入力ファイルの最終レコードまでが範囲となります。ただし,複数の入力ファイルを指定した場合,次の入力ファイルでパターン2に一致するレコードを検索します。この書式は50個まで指定できます。
- BEGIN
-
ファイル入力の開始前に実行するアクションに対するパターンです。アクションの記述を省略できません。また,ほかのパターンと組み合わせることはできません。なお,複数の入力ファイルを指定している場合は,最初のファイル入力開始前にアクションが実行されます。
- END
-
ファイルの最後のレコードに対するアクション実行後,またはexit制御文で終了した場合に実行するアクションに対するパターンです。アクションの記述を省略できません。また,ほかのパターンと組み合わせることはできません。なお,複数の入力ファイルを指定している場合は,最後のファイルの最後のレコードに対するアクション実行後となります。
制御文
使用できる制御文を次の表に示します。if文,while文,for文,do文,break文,continue文,return文の構文規則はC言語と同じです。ただし,for文の初期化式と再初期化式は1つの式だけ指定できます。
制御文 |
構文 |
内容 |
---|---|---|
if文 |
if (条件式) 処理 [else 処理] |
条件分岐します。 |
if (変数 in 配列) 処理[else 処理] |
変数に指定した添え字の配列要素が配列に存在するかどうかを判定します。 |
|
while文 |
while (条件式) 処理 |
条件が成立している間,繰り返します。 |
for文 |
for (初期化式; 継続条件式; 再初期化式) 処理 |
繰り返し実行します。 |
for (変数 in 配列) 処理 |
各配列要素の添え字の値を順次取り出しながら処理します。添え字の値の取り出しは順不同です。 |
|
do文 |
do 処理 while (継続条件式) |
後判定によって条件が成立している間,繰り返します。 |
break文 |
break |
繰り返し処理を抜けます。 |
continue文 |
continue |
繰り返し処理を中断して,繰り返し処理の先頭に戻ります。 |
next文 |
next |
処理中の入力レコードに対して,この制御文以降の処理を停止し,次の入力レコードの処理を開始します。 |
nextfile文 |
nextfile |
処理中の入力ファイルに対して,この制御文以降の処理を停止し,次の入力ファイルの処理を開始します。 |
return文 |
return [expr] |
ユーザー定義関数を終了します。式exprで指定した値を呼び出し元に返します。式exprを指定しない場合は,0がユーザー定義関数の戻り値となります。 |
delete文 |
delete 配列 |
配列を削除します。 |
delete 配列[要素] |
配列の要素を削除します。 |
|
exit文 |
exit [expr] |
処理中のスクリプトの実行を停止します。 式exprで指定した値をコマンドの終了コードとして返します。式exprを指定しない場合は,0がコマンドの終了コードとなります。式exprで指定した値は符号付きの4バイトの数値として扱います。 Windowsの場合,式exprで指定した値がコマンドの終了コードとなります。UNIXの場合,式exprで指定した値が0〜255の範囲外のときは,値の下位8ビットがコマンドの終了コードとなります。JP1/Advanced Shellのジョブ定義スクリプトから実行する場合は,0〜255の範囲の値を指定してください。 WindowsでJP1/Advanced Shellのジョブ定義スクリプトから実行する場合,式exprで指定した値が0〜255の範囲外のときは,コマンドの呼び出し元に返す終了コードは式exprで指定した値とは異なります。JP1/Advanced Shellでのコマンドの終了コードの扱いについては「5.8.8 ジョブ,ジョブステップおよびコマンドの終了コード」を参照してください。 |
組み込み関数
使用できる組み込み関数を次に示します。
- 数学関数
-
使用できる数学関数を次の表に示します。
関数名
内容
atan2(y,x)
y/xの逆正接を返します。単位はラジアンです。引数が不足している場合は1を返し,警告メッセージを出力します。
cos(x)
xの余弦を返します。単位はラジアンです。
exp(x)
xの指数関数を返します。結果がオーバーフローまたはアンダーフローする場合は1を返し,警告メッセージを出力します。
int(x)
xの小数点以下を切り捨てて整数を返します。
log(x)
xの自然対数を返します。xが0または負の場合は1を返し,警告メッセージを出力します。
rand()
乱数nを返します(0≦n<1の範囲)。srand関数でシード値を設定しない場合は,コマンドを実行するたびに同じ値を返します。
sin(x)
xの正弦を返します。単位はラジアンです。
sqrt(x)
xの平方根を返します。xが負の場合は1を返し,警告メッセージを出力します。
srand([expr])
式exprをrand関数用のシード値を設定して,設定したシード値を返します。exprを省略した場合は,時刻を基にしたシード値を設定します。
- 文字列関数
-
使用できる文字列関数を次の表に示します。マルチバイト文字は1文字として扱います。
関数名
内容
gsub(r, t[, s])
文字列s中のすべての正規表現rをtに置き換えます。sを省略した場合,$0(レコード全体が格納されているフィールド変数)を置き換え対象とします。tに&を指定した場合は,&が一致した文字列に置き換えられます。終了コードとして,置き換えた回数を返します。
index(s,t)
文字列s中の文字列tの位置を返します。文字列tがなかった場合は0を返します。
length[([s])]
文字列sの文字数を返します。sを指定しなかった場合は,$0(レコード全体が格納されているフィールド変数)の文字数を返します。
match(s, r)
文字列s中の正規表現rが現れる位置を返します。正規表現rがなかった場合には0を返します。また,RSTART組み込み変数には正規表現rに一致した文字列の位置が設定されます。不一致時は0になります。RLENGTH組み込み変数には正規表現rに一致した文字列の長さが設定されます。不一致時は-1になります。
sprintf(書式, 式[, ... ])
書式に従って,式を整形した結果の文字列を返します。書式については出力書式の説明を参照してください。
split(s, array[, fs])
文字列sをフィールドセパレータfsによってフィールド分割し,配列arrayに格納します。戻り値として配列の要素数を返します。分割した各フィールドの値は,配列arrayに,array[1],array[2],…,array[戻り値]の順に格納されます。
フィールドセパレータfsの指定を省略した場合は,フィールドセパレータとして組み込み変数FSの値が使用されます。
フィールドセパレータfsには文字列および正規表現を指定できます。また,フィールドセパレータfsに文字指定なしを示す「""」を指定した場合は,1文字ずつ分割されます。
sub(r, t[, s])
文字列s中に最初にあった正規表現rをtに置き換えます。sを省略した場合,$0(レコード全体が格納されているフィールド変数)を置き換え対象とします。tに&を指定した場合は,&が一致した文字列に置き換えられます。正規表現rがあった場合は終了コードとして1を返します。正規表現rがなかった場合は0を返します。
substr(s, m[, n])
文字列sのm番目の文字から最大n文字の部分文字列を返します。nを省略した場合は,m番目以降のすべての文字列を返します。
tolower(str)
文字列str中のすべての英大文字を英小文字に変換した文字列を返します。
toupper(str)
文字列str中のすべての英小文字を英大文字に変換した文字列を返します。
- ビット操作関数
-
使用できる操作関数を次の表に示します。xおよびyは符号付きの4バイトの数値として扱います。
関数名
内容
compl(x)
整数xの1の補数を返します。
and(x, y)
整数xと整数yのビットごとの論理積を返します。
or(x, y)
整数xと整数yのビットごとの論理和を返します。
xor(x, y)
整数xと整数yのビットごとの排他的論理和を返します。
lshift(x, n)
整数xをビット数n分,左にシフトした値を返します。ビットのシフトは算術シフトで行われるため,符号部分もシフト対象となります。
rshift(x, n)
整数xをビット数n分,右にシフトした値を返します。ビットのシフトは算術シフトで行われるため,符号部分は右にシフトした時に補てんする符号として扱われます。
- 入出力関数
-
使用できる入出力関数を次に示します。
- getline [変数名]
-
現在の入力ファイルから次のレコードを入力します。変数名が指定されている場合は変数名で指定した変数にレコードを入力し,組み込み変数のNRおよびFNRが設定されます。変数名の指定を省略した場合は,フィールド変数$0にレコードを入力し,組み込み変数のNF,NRおよびFNRが設定されます。レコードの入力に成功すると1を返し,ファイルの終端に到達すると0を返し,エラーが発生すると-1を返します。
- getline [変数名] < パス名
-
パス名に指定したファイルから次のレコードを入力します。パス名は"(ダブルクォーテーション)で囲んで指定します。パス名の代わりにパス名を代入した変数の名称も指定できます。パス名に「-」を指定した場合は標準入力から入力します。
指定例を次に示します。
getline line < "file001.txt"
変数名が指定されている場合は変数名で指定した変数にレコードを入力します。変数名の指定を省略した場合は,フィールド変数$0にレコードを入力し,組み込み変数のNFが設定されます。
指定したファイルは,getline関数で最初にレコードを受け取るときにオープンし,awkコマンドが終了するまでオープンしたままとなります。このため,同じファイルに対して再度先頭レコードから入力を開始したい場合は,close関数を実行する必要があります。
- コマンド名 | getline [変数名]
-
コマンド名で指定したプログラムがパイプに出力したレコードを,getline関数を使用して入力します。コマンド名は,実行するプログラムの名称とその引数の値を"(ダブルクォーテーション)で囲んで,コマンドライン形式で記述します。コマンド名の代わりにコマンド名を代入した変数の名称も指定できます。
変数名が指定されている場合は,変数名で指定した変数にレコードを入力します。変数名の指定を省略した場合は,フィールド変数$0にレコードを入力し,組み込み変数のNFが設定されます。指定例を次に示します。
コマンドがパイプに出力した内容から1レコード分を入力し,フィールド変数$0に代入します。
"cat -n file01.txt" | getline
コマンド名を変数に代入し,変数名とgetline関数を接続して実行します。
rtxt = "cat -n file01.txt" rtxt | getline
指定したプログラムの出力を受け取るためのパイプ作成とプログラム実行は,「コマンド名 | getline [変数名]」実行時に行われます。同じコマンド名を複数回実行する場合,パイプ作成とプログラム実行が行われるのは最初に指定したコマンド名の実行のときだけです。作成されたパイプはawkコマンドが終了するまで存在します。このため,コマンド名で指定したプログラムを再実行したい場合は,close関数を実行する必要があります。次に例を示します。
"cat -n file01.txt" | getline rec →1. "cat -n file01.txt" | getline rec →2. close("cat -n file01.txt") →3. "cat -n file01.txt" | getline rec →4.
-
パイプの作成およびcatコマンドの実行が行われ,catコマンドがパイプに出力した1番目のレコードの内容が変数recに格納されます。
-
catコマンドがパイプに出力した2番目のレコードの内容が変数recに格納されます。
-
パイプが閉じられます。
-
パイプの作成およびcatコマンドの実行が行われ,catコマンドがパイプに出力した1番目のレコードの内容が変数recに格納されます。なお,コマンド名の記述内容がprint関数およびprintf関数で指定するコマンド名の記述内容と同じでも別のコマンド名の記述と見なされます。
-
- print [式[, ... ]]
-
式を標準出力に出力します。式を省略した場合は,現在の入力レコードを標準出力に出力します。式をコンマ(,)で区切って複数指定した場合,各式は組み込み変数OFSの値で区切られます。出力レコードの終端には組み込み変数ORSの値が出力されます。
- print [式[, ... ]] > パス名
-
式をパス名で指定したファイルに出力します。パス名は"(ダブルクォーテーション)で囲んで指定します。パス名の代わりにパス名を代入した変数の名称も指定できます。式を省略した場合は,現在の入力レコードをパス名で指定したファイルに出力します。式をコンマ(,)で区切って複数指定した場合,各式は組み込み変数OFSの値で区切られます。出力レコードの終端には組み込み変数ORSの値が出力されます。既存ファイルに追加書きで出力する場合は「>>パス名」で指定します。
指定したファイルは,print関数で最初に出力するときにオープンし,awkコマンドが終了するまでオープンしたままとなります。このため,同じファイルに対して,ファイルの先頭から出力したい場合はclose関数を実行する必要があります。
- print [式[, ... ]] | コマンド名
-
式をパイプに出力し,コマンド名で指定したプログラムに渡します。
コマンド名は,実行するプログラムの名称とその引数の値を"(ダブルクォーテーション)で囲んで,コマンドライン形式で記述します。コマンド名の代わりにコマンド名を代入した変数の名称も指定できます。
式を省略した場合は,現在の入力レコードをパイプに出力します。式をコンマ(,)で区切って複数指定した場合,各式は組み込み変数OFSの値で区切られます。出力レコードの終端には組み込み変数ORSの値が出力されます。
指定したプログラムへ出力結果を渡すためのパイプ作成とプログラム実行は,「print [式[, ... ]] | コマンド名」実行時に行われます。同じコマンド名を複数回実行する場合,パイプ作成とプログラム実行が行われるのは最初に指定したコマンド名の実行のときだけです。作成されたパイプはawkコマンドが終了するまで存在します。このため,コマンド名で指定したプログラムを再実行したい場合は,close関数を実行する必要があります。コマンド名の記述内容がgetline関数で指定するコマンド名の記述内容と同じでも別のコマンド名の記述と見なされます。
- printf 書式[,式[, ... ]]
-
書式に従って標準出力に出力します。書式については出力書式の説明を参照してください。その他の内容は「print [式[, ... ]]」を参照してください。
Windowsの場合,改行文字を表す「\n」を指定したとき,出力先には[CR]+[LF]で出力されます。
- printf 書式[,式[, ... ]] >パス名
-
書式に従ってファイルに出力します。書式については出力書式の説明を参照してください。その他の内容は「print [式[, ... ]] >パス名」を参照してください。
- printf 書式[,式[, ... ]] | コマンド名
-
書式に従ってパイプに出力します。書式については出力書式の説明を参照してください。その他の内容は「print [式[, ... ]] | コマンド名」を参照してください。コマンド名の内容がprint関数に指定したコマンド名と同じ場合は,同じプログラムの実行に対して出力します。
- close(パス名|コマンド名)
-
getline関数,print関数,printf関数で使用したファイルまたはgetline関数,print関数,printf関数でコマンド名実行時に作成されたパイプをクローズします。
クローズに成功した場合は0を返します。失敗した場合は,ファイルのときはOSのclose関数の戻り値,パイプのときはOSのpclose関数の戻り値を返します。
引数にはgetline関数,print関数,printf関数で指定したパス名またはコマンド名を指定します。パス名は"(ダブルクォーテーション)で囲んで指定します。コマンド名は,実行するプログラムの名称とその引数の値を"(ダブルクォーテーション)で囲んで,コマンドライン形式で記述します。また,getline関数,print関数,printf関数で指定したパス名やコマンド名が格納されている変数も指定できます。なお,close関数に記述するパス名やコマンド名は,getline関数,print関数,printf関数に記述したパス名やコマンド名の文字列と文字数も含めて同じにしてください。パス名やコマンド名の文字列が異なる場合,別のパス名または別のコマンド名と見なされます。1つのclose関数に指定したコマンド名がgetline関数,print関数またはprintf関数で指定したコマンド名と同じ場合は,getline関数で作成されたパイプとprint関数またはprintf関数で作成されたパイプの両方がクローズされます。指定例を次に示します。
print "hitachi" | "cat -n" close("cat -n")
- fflush([パス名|コマンド名])
-
getline関数,print関数,printf関数で使用したファイルまたはgetline関数,print関数,printf関数でプログラム実行時に作成されたパイプをフラッシュします。フラッシュに成功した場合は0を返します。失敗した場合は,OSのfflush関数の戻り値を返します。
引数にはgetline関数,print関数,printf関数で指定したパス名またはコマンド名を指定します。パス名は"(ダブルクォーテーション)で囲んで指定します。コマンド名は,実行するプログラムの名称とその引数の値を"(ダブルクォーテーション)で囲んで,コマンドライン形式で記述します。また,getline関数,print関数,printf関数で指定したパス名やコマンド名が格納されている変数も指定できます。なお,fflush関数に記述するパス名やコマンド名は,getline関数,print関数,printf関数に記述したパス名やコマンド名の文字列と文字数も含めて同じにしてください。パス名やコマンド名の文字列が異なる場合,別のパス名または別のコマンド名と見なされます。
引数の指定を省略した場合は,すべてのファイルとパイプをフラッシュします。
- 汎用関数
-
使用できる汎用関数を次の表に示します。
関数名
内容
system(コマンド名)
コマンド名に指定したプログラムを実行し,実行したプログラムのステータスを返します。
コマンド名は,実行するプログラムの名称とその引数の値を"(ダブルクォーテーション)で囲んで,コマンドライン形式で記述します。コマンド名の代わりにコマンド名を代入した変数の名称も指定できます。
UNIXの場合,実行したプログラムのステータスは,プログラムが返す終了コードの下位8ビットの値となります。
ユーザー定義関数
組み込み関数以外に独自の関数を定義できます。構文を次に示します。
function|func name([param[,…]]) { statements }
関数名nameに使用できる文字は,英数字および_(アンダースコア)だけです。また,先頭文字は数字以外でなければなりません。
関数の引数paramにはユーザー定義の変数または配列の名称を指定できます。関数へ渡す引数は,ユーザー定義の変数は値渡しで,配列は参照渡しで行われます。
関数定義で指定した引数の数と,関数呼び出し時に指定した引数の数が異なっていても解析エラーにはなりません。ただし,関数呼び出し時に指定した引数の数が関数定義で指定した引数の数よりも多い場合は,警告メッセージが出力されます。関数の定義で指定した引数は,ローカル変数としますが,関数呼び出し時に指定した引数の数が関数定義で指定した引数の数よりも多い場合は,関数呼び出し時の余分な引数はグローバル変数と見なされます。
関数の定義で指定できる引数の数は50個までです。また,関数呼び出し時に指定できる引数の数も50個までです。なお,引数の数が50個以内かどうかは,関数の呼び出し時にチェックされます。
変数
スクリプトで使用する変数にはユーザー定義変数,フィールド変数,組み込み変数および配列があります。ユーザー定義変数と配列はスクリプト内で最初に使用したときに生成されます。なお,初期化されていない(演算や代入などの式で使用されていない)変数の初期値は,数値としては0,文字列値としてはNULLが格納されます。
変数の値の型は,変数が使用されるごとに,使用方法に合わせて数値または文字列に変化します。ただし,文字列が数字以外の場合は0の数値とします。例えば,次に示す2つのprint関数の出力結果は両方とも7が出力されます。
x = "3" + "4" y = 3 + 4 print x print y
変数ごとに説明します。
-
ユーザー定義変数
変数名に使用できる文字は,英数字と_(アンダースコア)だけです。先頭文字は数字以外でなければなりません。
-
配列
配列名は,変数名のあとに[ ](角括弧)で添え字を囲んで表します。添え字には数字だけでなく"(ダブルクォーテーション)で囲まれた文字列も使用できます。また,添え字をコンマで区切って複数記述し,多次元配列を表せます。
awkコマンドの多次元配列は,各次元の添え字の値を組み込み変数SUBSEPの値で連結し,1つの文字列の添え字として扱います。多次元配列は内部的には一次元配列として処理されます。例えば,組み込み変数SUBSEPの値を「#」に変更したあとに配列を作成した場合,2つのprint関数は同じ値を出力します。指定例を次に示します。print関数の出力結果は両方とも「日立」になります。
SUBSEP = "#" arry["あ", "か", "さ"] = "日立" print arry["あ", "か", "さ"] print arry["あ#か#さ"]
-
フィールド変数
入力レコードの内容を参照するために,次のフィールド変数があります。
変数名
内容
$0
入力ファイルから現在読み込んでいるレコードの内容を設定します。
$1,$2,...
現在読み込んでいるレコードの内容を順に設定します。
組み込み変数FSの値によって分割された各フィールド値が,レコードの最初のフィールドに$1変数,2番目のフィールドに$2変数というように設定されます。
$変数名
変数にフィールド番号を設定することで,$0や$1など直接フィールド番号を記述した場合と同じようにフィールドを参照できます。※
関数や制御文で使用する場合,使用する前に変数にフィールド番号を設定する必要があります。
$(式)
フィールド番号を求める式(変数名+1など)を式に指定することで,$0や$1など直接フィールド番号を記述した場合と同じようにフィールドを参照できます。
- 注※
-
次の場合,「print $a」および「print $1」は同じ内容が出力されます。
a = 1 print $a print $1
-
組み込み変数
次の組み込み変数があります。
変数名
内容
ARGC
コマンドライン引数の個数です。オプション値およびスクリプト指定値は含みません。スクリプトおよび-vオプションで変更できます。-vオプションでARGCに0を設定した場合,引数に対象パス名が指定されていない状態になります。
ARGV
コマンドライン引数の配列です。スクリプトで変更できます。引数に指定した対象パス名が格納されている要素にNULLを設定すると,入力ファイルからレコードの入力が行われません。-vオプションで指定した値は上書きされます。
CONVFMT※
数値を変換するときに使用する変換書式です。デフォルトは%.6gです。数値に小数部分がある場合に有効となります。
ENVIRON
実行時の環境変数の配列です。添え字は環境変数名です。環境変数名は"(ダブルクォーテーション)で囲んで指定します。環境変数名の代わりに環境変数名を代入した変数の名称も指定できます。
FILENAME
現在の入力ファイル名です。標準入力からの入力の場合はファイル名に「-」が設定されます。
FNR
現在の入力ファイルの入力レコード数です。対象パス名で指定したファイルから1レコードを入力するたびに更新されます。また,「getline [変数名]」でレコードを入力するときにも更新されます。
複数の対象パス名を指定した場合,次の入力ファイルから入力を開始するときに0で初期化されます。
FS
フィールドセパレータです。デフォルトは1バイトのスペースです。正規表現を使用できます。フィールドセパレータを変更する場合,指定する文字列の長さは99バイト以下にしてください。また,フィールドセパレータ値が1バイトのスペースの場合は,1バイトのスペースとタブ(\t)によってフィールド分割されます。フィールドセパレータに値を設定しない場合は,1文字ずつフィールド分割されます。
複数の文字を指定する場合は,正規表現となるため,\はエスケープ文字として扱われます。-Fオプションと同時に使用した場合は,この変数の値が優先されます。
NF
現在の入力レコードのフィールド数です。対象パス名で指定したファイルからレコードを入力すると格納されます。また,getline関数でフィールド変数$0にレコードを入力したときにも格納されます。
$NFと記述すると,現在の入力レコードの最終フィールドの値を参照できます。
NR
現在までに読み込んだ入力レコード数です。対象パス名で指定したファイルから1レコードを入力するたびに更新されます。また,「getline [変数名]」で次のレコードを入力するときにも更新されます。
複数の対象パス名を指定した場合は,レコードの入力が終了したファイルのレコード数も含まれます。
OFMT※
数値の出力書式です。デフォルトは%.6gです。数値に小数部分がある場合に有効となります。
OFS
出力フィールドセパレータです。デフォルトは1バイトのスペースです。
ORS
出力レコードセパレータです。デフォルトは改行文字(\n)です。Windowsの場合,改行文字(\n)は[CR]+[LF]で出力されます。
RLENGTH
match関数で一致した文字列の長さです。一致しなかった場合は-1が設定されます。
RS
入力レコードセパレータです。デフォルトは改行文字です。値を変更する場合,1バイトの文字だけ設定できます。文字列やマルチバイト文字を指定した場合は,先頭1バイトを使用します。改行文字(\n)を設定した場合,Windowsは,入力ファイル中の[CR]+[LF]または[LF]が対象となります。UNIXは,入力ファイル中の[LF]が対象となります。改行文字以外の値を設定した場合,Windowsは,入力レコードに含まれる改行文字は[LF]です。UNIXは,入力ファイル中の改行文字が[CR]+[LF]の場合は[CR]も含まれます。
RSTART
match関数で一致した文字列の開始位置です。一致しなかった場合は0が設定されます。
SUBSEP
多次元配列のセパレータです。デフォルトは0x1Cです。
演算子
使用できる演算子を優先順位の低い順に次の表に示します。式の中で同じ優先順位の演算子は,式の左側に記述された演算子の優先順位が高くなります。
演算子 |
説明 |
---|---|
=,+=,-=,*=,/=,%=,^=,**= |
代入演算子です。 |
?: |
三項演算子です。 |
|| |
論理ORです。 |
&& |
論理ANDです。 |
~,!~ |
正規表現の一致(~)と不一致(!~)です。 |
<,<=,>,>=,!=,== |
関係演算子です。 |
スペース |
文字列連結です。 |
+,- |
加算および減算です。 |
*,/,% |
乗算,除算および剰余です。 |
+,-,! |
単項および論理否定です。 |
^,** |
累乗です。 |
++,-- |
インクリメントおよびデクリメントです。 |
出力書式
printf関数およびsprintf関数で,変換指定を示す%と共に指定する変換指定子を次の表に示します。
文字 |
説明 |
---|---|
c |
1バイト文字です。 |
s |
文字列です。 |
d |
符号付き10進整数です。 |
i |
|
o |
符号なし8進整数です。 |
x |
符号なし16進整数です。10〜15の値には「abcdef」を使用します。 |
X |
符号なし16進整数です。10〜15の値には「ABCDEF」を使用します。 |
u |
符号なし10進整数です。 |
f |
浮動小数点数です。[-]dddd.dddd形式に変換します。 |
e |
浮動小数点数です。[-]d.dddde[+-]dd[d]形式に変換します。 |
g |
変換指定子eまたはfで出力される符号付きの値のうち,指定された値および精度を表現できる短い方の書式です。末尾の0は出力されません。 |
E |
浮動小数点数です。[-]d.ddddE[+-]dd[d]形式に変換します。 |
G |
変換指定子Eまたはfで出力される符号付きの値のうち,指定された値および精度を表現できる短い方の書式です。末尾の0は出力されません。 |
% |
%の文字です。 |
エスケープ文字
次の個所にはエスケープ文字を使用できます。
-
-Fオプションの入力フィールドセパレータ
-
-vオプションの変数値
-
引数で指定する組み込み変数の変数値
-
パターンおよび変数への代入などで指定する"(ダブルクォーテーション)で囲まれた文字列
使用できるエスケープ文字を次の表に示します。
エスケープ文字 |
意味 |
---|---|
\a |
アラート文字(ベル) |
\b |
バックスペース文字 |
\f |
フォームフィード文字(改ページ) |
\n |
改行文字 |
\r |
復帰文字 |
\t |
タブ文字 |
\v |
垂直タブ文字 |
\d,\dd,\ddd |
1〜3桁の8進数で表された文字※1。0を意味する数値は指定できません。 |
\xhex |
16進値で表された文字(0〜9,a〜f,A〜F)※1※2。0を意味する数値は指定できません。 |
\c |
任意のリテラル文字(「\"」の場合「"」) |
\\ |
1つのバックスラッシュ文字 |
文字コード種別 |
指定できる値(16進数値) |
---|---|
シフトJIS |
0x01-0x80,0xA0-0xDF,0xFD-0xFF |
UTF-8 |
0x01-0xBF,0xFE-0xFF |
EUC |
0x01-0x8D,0x90-0xA0,0xFF |
C |
0x01-0xFF |
なお,-vオプションの変数値や,引数で指定する組み込み変数の変数値に指定した\は,エスケープ文字として扱われます(シングルクォーテーションで囲んでいるケースを除く)。そのため,パス名を指定するときは注意が必要です。例を次に示します。
- (例1)正しいパス名(d:\a\b\c)をawkコマンドのスクリプトに渡せない例
-
この例では,\がエスケープ文字として処理されて\が削除された結果,VAR001にはc:\a\b\cが設定されます。
その後,awkコマンドの変数に設定される際には再び\がエスケープ文字として処理され,最終的にVAR001にはc:abcが設定されます。
CCC01="c:\\a\\b\\c" awk -v VAR001="${CCC01}" -f prog01.awk
同様に次の2つの例も正しいパス名を渡せません。
awk -v VAR001=c:\\a\\b\\c -f prog01.awk awk -v VAR001='c:\a\b\c' -f prog01.awk
- (例2)正しいパス名(d:\a\b\c)をawkコマンドのスクリプトに渡せる例
-
この例では,CCC01,CCC02の両方ともc:\\a\\b\\cが格納されます。
その後,awkコマンドのVAR001へ格納される際にはc:\a\b\cとなり,正しく処理できます。
CCC01='c:\\a\\b\\c' CCC02="c:\\\\a\\\\b\\\\c" awk -v VAR001="${CCC01}" -f prog01.awk awk -v VAR001="${CCC02}" -f prog01.awk
同様に次の2つの例も正しいパス名を渡せます。
awk -v VAR001=c:\\\\a\\\\b\\\\c -f prog01.awk awk -v VAR001='c:\\a\\b\\c' -f prog01.awk
特殊ファイル名
getline関数で標準入力から入力したり,print関数およびprintf関数で標準出力,または標準エラー出力へ出力したりしたい場合に,それらの入力先および出力先を表す特殊ファイル名が使用できます。使用できる特殊ファイル名を次に示します。なお,特殊ファイル名をclose関数に指定しても無視されます。
特殊ファイル名 |
意味 |
---|---|
/dev/stdin |
標準入力 |
/dev/stdout |
標準出力 |
/dev/stderr |
標準エラー出力 |
終了コード
終了コード |
意味 |
---|---|
0 |
正常終了 |
1以上 |
エラー終了 |
exit文で指定した値 |
制御文のexit文で指定したコマンドの終了コード |
注意事項
-
awkコマンドは,数値を内部的に倍精度浮動小数点数(8バイト)として扱います。また,printf関数およびsprintf関数の出力書式に,変換指定子d,i,o,x,X,uを指定して出力および変換する場合は,4バイトの符号付き整数で丸めます。このため,4バイトの符号付き整数の範囲外の数値に,変換指定子d,i,o,x,X,uを指定して出力または変換をした場合に誤差が発生します。この誤差はOSに依存します。
-
getline関数,print関数およびprintf関数で,同時にオープンできるファイルの最大数は256個です。同時にオープンできるファイルには,コマンド指定によって生成されるパイプも含みます。なお,UNIXの場合,OS全体で同時にオープンできるファイルの最大値に達している,またはulimitでそのプロセスのファイルディスクリプタ数の最大値が制限されているなどのOSの設定値によっては,256個より少なくなります。
-
バイナリファイルからの入力およびバイナリデータの出力は,動作を保証しません。
-
system関数などによる外部プログラムの実行は,次のプログラムの引数として実行されます。このため,最大パス名長などの外部プログラム実行に関する仕様はそのプログラムの仕様に依存します。
-
Windowsの場合
環境変数COMSPECで指定したコマンドプロセッサの引数として実行されます。デフォルト値はcmd.exeです。なお,使用されるコマンドプロセッサは環境変数のCOMSPECとPATHによって決まります。
-
UNIXの場合
シェルの引数として実行されます。OSの仕様によって,起動されるプログラムは異なる可能性があります。
-
-
Windowsの場合,getline関数,print関数またはprintf関数で指定したコマンドからの入出力開始時に,デスクトップヒープ不足によって指定したコマンド実行でアプリケーションエラーとなる場合があります。このため,コマンド入出力が不要になったとき,close関数でクローズするまたはデスクトップヒープ指定値を見直してください。
-
Windowsの場合,system関数で実行するコマンドの引数にワイルドカードを含むファイル名やディレクトリ名を指定しても,ワイルドカードは展開されません。
-
Windowsの場合,getline関数,print関数,printf関数でパイプによって接続するコマンドの引数にワイルドカードを含むファイル名やディレクトリ名を指定しても,ワイルドカードは展開されません。
-
Windowsの場合,system関数のように外部プログラムを指定するところに,関連づけられているファイルのパス名を指定した場合,関連づけられているプログラムが起動します。バッチジョブで実行するときには注意が必要です。
-
Windowsの場合,入出力関数および汎用関数でパス名を指定するときは,次の指定をする必要があります。
-
ディレクトリ区切り文字に「\」を使用する場合は,「\\」で指定する必要があります。
-
system関数のように外部プログラムを指定するところにスペースを含むパス名を指定する場合は,パス全体を「\"」で囲む必要があります。
-
-Fオプションの入力フィールドセパレータ,-vオプションの変数値,引数で指定する組み込み変数の変数値に指定した「\」は,エスケープ文字を表す記号として扱われます。
-
-
Windowsの場合,system関数などで生成したプロセスにファイルディスクリプタが引き継がれないで,クローズされた状態になります。例えば,親プロセスがオープンしていたファイルディスクリプタに対して再度オープンしないで入出力を行おうとするとエラーになります。ただし,標準入力,標準出力および標準エラー出力は再度オープンされた状態になります。
-
Windowsの場合,system関数に指定したコマンド名にパスが含まれていないときは,コマンドプロンプトなどのコマンドプロセッサのパス検索順序で見つかったコマンドが実行されます。
-
exit文でコマンドの終了コードを返す場合,exit文に指定した値によっては,コマンドの呼び出し元に返す終了コードとexit文に指定した値が異なるときがあります。exit文で指定するコマンドの終了コードの詳細については,exit文の説明を参照してください。なお,awkコマンドではexit文で指定した値を4バイトの符号付き整数で丸めます。このため,4バイトの符号付き整数の範囲外の数値を指定した場合は誤差が発生します。この誤差はOSに依存します。
使用例
-
コマンドの引数に,レコードの検索するパターンおよびパターンに一致したレコード内の英小文字を英大文字に変換するアクションを指定します。入力ファイルはfile01.txtです。
file01.txtの内容
hitachi group01 Tokyo HITACHI group02 Yokohama hitachi group03 Fukuoka HITACHI group04 Hokkaido
コマンドの実行結果を次に示します。
C:\TEMP>%ADSH_OSCMD_DIR%\awk "/hitachi/{print toupper($0)}" file01.txt HITACHI GROUP01 TOKYO HITACHI GROUP03 FUKUOKA
-
2番目のフィールドが正規表現のパターンに一致するレコードを出力します。入力ファイルはfile01a.txtです。
file01a.txtの内容
hitachi group01 Tokyo hitachi group02 Yokohama hitachi grp0000 Fukuoka hitachi group04 Hokkaido
コマンドの実行結果を次に示します。
C:\TEMP>%ADSH_OSCMD_DIR%\awk "$2 ~ /group/" file01a.txt hitachi group01 Tokyo hitachi group02 Yokohama hitachi group04 Hokkaido
-
-Fオプションに入力フィールドセパレータとして#を指定して,3番目のフィールドの内容を出力します。入力ファイルはfile02.txtです。
file02.txtの内容
hitachi#group01#Nagoya HITACHI#group02#Hiroshima hitachi#group03#Ooita
コマンドの実行結果を次に示します。
C:\TEMP>%ADSH_OSCMD_DIR%\awk -F"#" "{print $3}" file02.txt Nagoya Hiroshima Ooita
-
コマンドの引数にアクションに渡す変数padstrとその値を指定します。スクリプトファイルはprog01.awkです。入力ファイルはfile03.txtです。
prog01.awkの内容
# program name : prog01 { count++ print padstr " " $0※ } END{ print "total record : " count }
- 注※
-
-vオプションで指定した変数の値,スペース,入力レコードの内容を出力します。
file03.txtの内容
group01 Tokyo group02 Yokohama group03 Fukuoka
コマンドの実行結果を次に示します。
C:\TEMP>%ADSH_OSCMD_DIR%\awk -v padstr="hitachi" -f prog01.awk file03.txt hitachi group01 Tokyo hitachi group02 Yokohama hitachi group03 Fukuoka total record : 3
-
コマンドの引数に入力ファイルfile02.txtに対する組み込み変数FSの値として#を指定します。入力ファイルはfile01.txtおよびfile02.txtです。
file01.txtの内容
hitachi group01 Tokyo HITACHI group02 Yokohama hitachi group03 Fukuoka HITACHI group04 Hokkaido
file02.txtの内容
hitachi#group01#Nagoya HITACHI#group02#Hiroshima hitachi#group03#Ooita
コマンドの実行結果を次に示します。
C:\TEMP>%ADSH_OSCMD_DIR%\awk "{print $3}" file01.txt FS="#" file02.txt Tokyo Yokohama Fukuoka Hokkaido Nagoya Hiroshima Ooita
-
group03を含むレコードからgroup06を含むレコードまでをファイルfile06.txtに出力します。スクリプトファイルはprog02.awkです。入力ファイルはfile04.txtおよびfile05.txtです。
prog02.awkの内容
BEGIN{ print "Extract record : group03 - group06" > "file06.txt" } /group03/,/group06/{ ※ count++; print >> "file06.txt"; } END{ printf "total record : %03d\n", count >> "file06.txt" }
- 注※
-
group03に一致するレコードからgroup06に一致するレコードを処理対象とします。
file04.txtの内容
hitachi group01 Tokyo HITACHI group02 Yokohama hitachi group03 Fukuoka HITACHI group04 Hokkaido
file05.txtの内容
hitachi group05 Nagoya HITACHI group06 Hiroshima hitachi group07 Ooita
コマンドの実行結果を次に示します。
C:\TEMP>%ADSH_OSCMD_DIR%\awk -f prog02.awk file04.txt file05.txt C:\TEMP>%ADSH_OSCMD_DIR%\cat file06.txt Extract record : group03 - group06 hitachi group03 Fukuoka HITACHI group04 Hokkaido hitachi group05 Nagoya HITACHI group06 Hiroshima total record : 004
-
ファイルfile04.txtの先頭レコードからgroup02を含むレコードまでを出力します。また,ファイルfile05.txtのすべてのレコードを出力します。スクリプトファイルはprog03.awkです。入力ファイルは直前のfile04.txtおよびfile05.txtです。
prog03.awkの内容
{ count++; print if ($2 == "group02") { nextfile※ } } END{ printf("total record : %03d\n", count) }
- 注※
-
2番目のフィールドの内容がgroup02の場合,次の入力ファイルの処理を開始します。
コマンドの実行結果を次に示します。
C:\TEMP>%ADSH_OSCMD_DIR%\awk -f prog03.awk file04.txt file05.txt hitachi group01 Tokyo HITACHI group02 Yokohama hitachi group05 Nagoya HITACHI group06 Hiroshima hitachi group07 Ooita total record : 005
-
レコードの2番目のフィールドがgroup02の場合,awkコマンドの実行を停止します。また,コマンドの終了コードとして,停止するまでに読み込んだレコード数を返します。スクリプトファイルはprog04.awkです。入力ファイルはfile04.txtおよびfile07.txtです。
prog04.awkの内容
{ print if ($2 == "group02") { exit(NR)※ } } END{ printf("total record : %03d\n", NR) }
- 注※
-
現在までに読み込んだレコード数が格納されている組み込み変数NRの値を終了コードとして,コマンドを終了します。
file04.txtの内容
hitachi group01 Tokyo HITACHI group02 Yokohama hitachi group03 Fukuoka HITACHI group04 Hokkaido
file07.txtの内容
hitachi group05 Nagoya HITACHI group06 Hiroshima hitachi group07 Ooita hitachi group03 Okinawa
コマンドの実行結果を次に示します。
C:\TEMP>%ADSH_OSCMD_DIR%\awk -f prog04.awk file04.txt file07.txt hitachi group01 Tokyo HITACHI group02 Yokohama total record : 002
-
レコード中に最初に出てくる特定の文字列を,sub関数を使用して変更します。スクリプトファイルは,prog05.awkです。入力ファイルはfile08.txtです。
prog05.awkの内容
{ if (sub(/日立/, "&製作所")※) { print } else { print "未変換レコード : " $0 } }
- 注※
-
レコード中の「日立」を「日立製作所」に置き換えます。
file08.txtの内容
日立 横浜支店 日立グループ 日立 東京支店 日立グループ 田中 沖縄支店 田中グループ 日立 福岡支店 日立グループ
コマンドの実行結果を次に示します。
C:\TEMP>%ADSH_OSCMD_DIR%\awk -f prog05.awk file08.txt 日立製作所 横浜支店 日立グループ 日立製作所 東京支店 日立グループ 未変換レコード : 田中 沖縄支店 田中グループ 日立製作所 福岡支店 日立グループ
-
レコード中の特定の文字列をgsub関数を使用してすべて変更します。スクリプトファイルは,prog06.awkです。入力ファイルはfile09.txtです。
prog06.awkの内容
{ if (gsub(/日立/, "&製作所") ※) { print } else { print "未変換レコード : " $0 } }
- 注※
-
レコード中のすべての「日立」を「日立製作所」に置き換えます。
file09.txtの内容
日立 横浜支店 日立グループ 日立 東京支店 日立グループ 田中 沖縄支店 田中グループ 日立 福岡支店 日立グループ
コマンドの実行結果を次に示します。
C:\TEMP>%ADSH_OSCMD_DIR%\awk -f prog06.awk file09.txt 日立製作所 横浜支店 日立製作所グループ 日立製作所 東京支店 日立製作所グループ 未変換レコード : 田中 沖縄支店 田中グループ 日立製作所 福岡支店 日立製作所グループ
-
特定の文字列の位置をindex関数によって求めます。スクリプトファイルは,prog07.awkです。
prog07.awkの内容
BEGIN{ str = "日立:hitachi" print "Column = " index(str, "hitachi") }
コマンドの実行結果を次に示します。
C:\TEMP>%ADSH_OSCMD_DIR%\awk -f prog07.awk Column = 4
-
文字列の長さをlength関数によって求めます。スクリプトファイルは,prog08.awkです。
prog08.awkの内容
BEGIN{ str = "日立:hitachi" print "Length = " length(str) }
コマンドの実行結果を次に示します。
C:\TEMP>%ADSH_OSCMD_DIR%\awk -f prog08.awk Length = 10
-
特定の文字列の位置と文字列の長さをmatch関数によって求めます。スクリプトファイルは,prog09.awkです。
prog09.awkの内容
BEGIN{ str = "hitachi:日立製作所" print "Column = " match(str, /製.所/) print "RSTART = " RSTART print "RLENGTH = " RLENGTH }
コマンドの実行結果を次に示します。
C:\TEMP>%ADSH_OSCMD_DIR%\awk -f prog09.awk Column = 11 RSTART = 11 RLENGTH = 3
-
文字列を特定の文字で分割し配列に格納します。スクリプトファイルは,prog10.awkです。
prog10.awkの内容
BEGIN{ str = "日立#横浜支店#日立グループ" num = split(str, arry,"#") for (i = 1; i <= num; i++ ) { print arry[i] } }
コマンドの実行結果を次に示します。
C:\TEMP>%ADSH_OSCMD_DIR%\awk -f prog10.awk 日立 横浜支店 日立グループ
-
特定の位置にある部分文字列を求めます。スクリプトファイルは,prog11.awkです。
prog11.awkの内容
BEGIN{ str = "hitachi:日立製作所" rtnstr = substr(str, 11, 2) print "SUBSTR = " rtnstr }
コマンドの実行結果を次に示します。
C:\TEMP>%ADSH_OSCMD_DIR%\awk -f prog11.awk SUBSTR = 製作
-
引数指定のファイル以外からレコードを入力します。スクリプトファイルはprog12.awkです。入力ファイルはfile10.txtです。
prog12.awkの内容
BEGIN{ while ((getline rec < "file10.txt"※) > 0) { print rec } }
- 注※
-
指定したファイルfile10.txtからレコードを入力し,レコードの内容を変数recに格納します。
file10.txtの内容
hitachi group01 Tokyo HITACHI group02 Yokohama hitachi group03 Fukuoka HITACHI group04 Hokkaido
コマンドの実行結果を次に示します。
C:\TEMP>%ADSH_OSCMD_DIR%\awk -f prog12.awk hitachi group01 Tokyo HITACHI group02 Yokohama hitachi group03 Fukuoka HITACHI group04 Hokkaido
-
print関数の出力内容をコマンドにパイプ経由で渡します。スクリプトファイルはprog13.awkです。入力ファイルはfile11.txtです。
prog13.awkの内容
BEGIN{ cmd = "sort " } { if (sub(/group01/, $2)) { count++ print | cmd※1 } } END{ close(cmd)※2 print "total record : " count }
- 注※1
-
変数cmdに指定したsortコマンドにレコードの内容を渡します。
- 注※2
-
close関数を実行することでパイプが閉じられsortコマンドの実行が終了します。
file11.txtの内容
hitachi group01 003 tokyo hitachi group02 001 yokohama hitachi group03 001 fukuoka hitachi group01 004 hokkaido hitachi group01 001 nagoya hitachi group02 001 hiroshima hitachi group01 002 ooita
コマンドの実行結果を次に示します。
C:\TEMP>%ADSH_OSCMD_DIR%\awk -f prog13.awk file11.txt hitachi group01 001 nagoya hitachi group01 002 ooita hitachi group01 003 tokyo hitachi group01 004 hokkaido total record : 4
-
配列の要素を削除します。スクリプトファイルはprog14.awkです。
prog14.awkの内容
BEGIN{ arry["福岡"] = "福岡" arry["北海道"] = "札幌" arry["神奈川"] = "横浜" arry["島根"] = "松江" for (key in arry) { printf(" %*s : %s\n", 6, key, arry[key]) } print "Deletes result of the array element" delete arry["神奈川"] for (key in arry) { printf(" %*s : %s\n", 6, key, arry[key]) } }
コマンドの実行結果を次に示します。
C:\TEMP>%ADSH_OSCMD_DIR%\awk -f prog14.awk 福岡 : 福岡 北海道 : 札幌 神奈川 : 横浜 島根 : 松江 Deletes result of the array element 福岡 : 福岡 北海道 : 札幌 島根 : 松江
-
プログラム開始時にディレクトリを作成し,作成したディレクトリ内のファイルにレコードの内容を出力します。スクリプトファイルはprog15.awkです。入力ファイルはfile12.txtです。
prog15.awkの内容
BEGIN{ if ((rc = system("mkdir dir001")※1)) { printf("system func error rc = %x\n", rc) > "/dev/stderr"※2 exit(1) } } { print >> "dir001\\outfile.txt" }
- 注※1
-
system関数によってmkdirコマンドを実行してディレクトリを作成します。
- 注※2
-
system関数の戻り値を標準エラー出力に出力します。
file12.txtの内容
hitachi group01 Tokyo HITACHI group02 Yokohama hitachi group03 Fukuoka HITACHI group04 Hokkaido
コマンドの実行結果を次に示します。
C:\TEMP>%ADSH_OSCMD_DIR%\awk -f prog15.awk file12.txt C:\TEMP>%ADSH_OSCMD_DIR%\cat dir001\\outfile.txt hitachi group01 Tokyo HITACHI group02 Yokohama hitachi group03 Fukuoka HITACHI group04 Hokkaido
-
ユーザー定義関数を呼び出し,ユーザー定義関数の処理結果を出力します。スクリプトファイルはprog16.awkです。
prog16.awkの内容
BEGIN{ a = 3 b = 4 result = func01(a, b, c) print "func01 = " result } function func01(x,y){ x *= x y *= y return x + y }
コマンドの実行結果を次に示します。
C:\TEMP>%ADSH_OSCMD_DIR%\awk -f prog16.awk awk: warning: function func01 called with 3 args, uses only 2※ source line number 4 func01 = 25
- 注※
-
ユーザー定義関数呼び出し時の引数の個数が,関数の定義で記述した引数の個数よりも多いため,警告メッセージが出力されます。
-
制御文の記述で構文エラーがある場合のメッセージを表示します。スクリプトファイルは,prog17.awkです。
prog17.awkの内容
BEGIN{ while ((getline rec < "file10.txt") > 0)) {※ print rec } }
- 注※
-
while文の「(」と「)」の数が不一致となっています。
コマンドの実行結果を次に示します。
C:\DIR>%ADSH_OSCMD_DIR%\awk -f prog17.awk awk: extra ) at source line 2 source file prog17.awk context is while ((getline rec < "file10.txt") > >>> 0)) <<< awk: syntax error at source line 2 source file prog17.awk awk: illegal statement at source line 2 source file prog17.awk extra )
-
組み込み関数の記述で書式が不正な場合のメッセージを表示します。スクリプトファイルはprog18.awkです。
prog18.awkの内容
BEGIN{ str = "日立:hitachi" print "Column = " index(str)※ }
- 注※
-
index関数の引数に検索する文字列の指定がありません。
コマンドの実行結果を次に示します。
C:\DIR>%ADSH_OSCMD_DIR%\awk -f prog18.awk awk: syntax error at source line 3 source file prog18.awk context is print "Column = " >>> index(str) <<< awk: illegal statement at source line 3 source file prog18.awk
-
JP1/Advanced Shellの一時ファイル機能とパス変換機能を利用してファイルを入出力します。ジョブ定義スクリプトはadsh001.ashです。スクリプトファイルはprog19.awkです。入力ファイルはfile12.txtです。
環境ファイルの一時ファイル機能とパス変換機能の指定内容
#-adsh_conf TEMP_FILE_DIR "C:\\TEMP\\ADSH" #-adsh_conf PATH_CONV_ENABLE / : #-adsh_conf PATH_CONV "/var/hitachi/jp1as/perm" "C:\\hitachi\\JP1AS\\perm"
adsh001.ashの内容
#-adsh_file_temp TEMP #-adsh_step_start adsh001 -onError stop "$ADSH_OSCMD_DIR/awk" -f prog19.awk "/var/hitachi/jp1as/perm/file12.txt" #-adsh_step_error exit 100 #-adsh_step_end
prog19.awkの内容
{ print FILENAME,":",$0 > ENVIRON["TEMP"] } END{ while(getline var < ENVIRON["TEMP"]) print var }
file12.txtの内容
001 abc 002 efgh 003 ijklmnop
awkコマンドの出力内容(ジョブの標準出力に出力される内容)
C:\hitachi\JP1AS\perm\file12.txt : 001 abc C:\hitachi\JP1AS\perm\file12.txt : 002 efgh C:\hitachi\JP1AS\perm\file12.txt : 003 ijklmnop
-
引数が指定されていない場合のメッセージを表示します。
C:\DIR>%ADSH_OSCMD_DIR%\awk usage: awk [-F fs] [-v var=value] [-f progfile | prog] [[file ...] | [built-in-var=value ...]] ...
-
オプションエラーのメッセージを表示します。
このメッセージは,コマンドを実行するプラットフォームによって異なる場合があります。Windowsの例を次に示します。
C:\TEMP>%ADSH_OSCMD_DIR%\awk -z awk: illegal option -- z usage: awk [-F fs] [-v var=value] [-f progfile | prog] [[file ...] | [built-in-var=value ...]] ...