予約変数など

寄稿:東條遼平

サンプルプログラムの入力テキストには以下のものを使っています.(progreport)

programing report 123.4
Linux vine 4567 knoppix filter
java c 567 awk
hogehoge foofoo

項や行の値を持つ変数

$1,$2,$3とそれぞれの項に対応し,$0は行自体を値に持ちます.数字の代わりに変数でも構いません.

$ awk '{for(i=1; i<3; i++) print $i}' progreport
programing
report
Linux
vine
java
c
hogehoge
foofoo

出力区切り文字

OFSで出力時の区切り文字を設定します.デフォルトはスペースになっています.

$ awk 'BEGIN{OFS="%";print "4", "6";}'
4%6

入力区切り文字

FSで入力時の区切り文字を設定します.デフォルトはスペースになっているので,上のprogreportをうまく読めますが,#に変更してみます.

$ awk 'BEGIN{FS="#"}{print $1}' progreport
programing report 123.4
Linux vine 4567 knoppix filter
java c 567 awk
hogehoge foofoo

出力レコード区切り子の制御

printで改行してくれますが,これをORSで変更できます.

$ awk 'BEGIN{ORS="#"}{print $1}' progreport
programing#Linux#java#hogehoge#

入力レコード区切り子の制御

デフォルトでは改行で1行とみなしていますが,RSで変更できます.空行で区切るときはRS=""

$ awk 'BEGIN{RS="#"}{print $5}' progreport
vine

今まで読み込んだ行数

NRはそのときの行番号としても使えますが,正確には読み込んだ行数ですので ENDで使えばファイル内の行数となります.

$ awk 'END{print NR}' progreport
4

項の数

NFはそれぞれの行に存在する項の数を保持します.

$ awk '{print NF}' progreport
3
5
4
2

現在のファイルから読み込んだ行数

FNRはNRとは違い読み込むファイルが変われば値がクリアされます.

$ awk '{print FNR, NR}' progreport progreport
1 1
2 2
3 3
4 4
1 5
2 6
3 7
4 8

現在のファイル名

FILENAME現在のファイル名を保持します.ファイルが変われば変更されます.

$ awk '{print FILENAME}' progreport
progreport
progreport
progreport
progreport

コマンドライン引数の数

ARGCはコマンドライン引数の数を保持します.オプション等含まない.

$ awk 'BEGIN{print ARGC}' progreport
2

コマンドライン引数の値

ARGV[0],ARGV[1]など

$ awk 'BEGIN{print ARGV[0], ARGV[1]}' progreport
awk progreport

数値から文字列に変換するときのフォーマット

CONVFMTで変更する.デフォルトは"%.6g".

$ awk 'BEGIN{CONVFMT="%2.2f"; a=12.1234; printf a}'
12.12

printにおいて数値から文字列に変換するときのフォーマット

OFMTはCONVFMTt違い,printのときに適用されるフォーマット.

$ awk 'BEGIN{OFMT="%2.2f"; a=12.1234; print a}'
12.12

多次元配列のインデックスを結合する文字

SUBSEPですが,デフォルトは"\034"となっています. a["pro", "report"]なら"pro\034report"となります.以下はインデックスが"pro#report"となったために表示されません.

$awk 'BEGIN{a["pro","report"]=1;SUBSEP="#";print a["pro","report"]}'

PCの環境変数を保持している連想配列

ENVIRONのインデックスに環境変数の名前を入れるとその値がパスになっている.

$ awk 'BEGIN{print ENVIRON["HOME"]}'
/home/progreport

match関数で一致した文字数

RLENGTHは正規表現を使ったときは最長の値になります.一致しなかったときは-1

$ awk 'BEGIN{match("progreport", "ogre"); print RLENGTH}'
4

match関数で一致した部分文字列の開始位置

RSTARTで,一致しなかったときは0になります.

$ awk 'BEGIN{match("progreport", "ogre"); print RSTART}'
3
Valid XHTML 1.1! home > コンピュータ > プログラミング >
リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Modified by 物理のかぎプロジェクト PukiWiki 1.4.5_1 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-jiPowered by PHP 5.3.29HTML convert time to 0.013 sec.