RIGHT:寄稿:東條遼平 サンプルプログラムの入力テキストには以下のものを使っています。(progreport) programing report 123.4 Linux vine 4567 knoppix filter java c 567 awk hogehoge foofoo * 項や行の値を持つ変数 [#o9b24115] $1、$2、$3とそれぞれの項に対応し、$0は行自体を値に持ちます。数字の代わりに変数でも構いません。 $ awk '{for(i=1; i<3; i++) print $i}' progreport programing report Linux vine java c hogehoge foofoo * 出力区切り文字 [#feb61118] OFSで出力時の区切り文字を設定します。デフォルトはスペースになっています。 $ awk 'BEGIN{OFS="%";print "4", "6";}' 4%6 * 入力区切り文字 [#oeed1ea4] FSで入力時の区切り文字を設定します。デフォルトはスペースになっているので、上のprogreportをうまく読めますが、#に変更してみます。 $ awk 'BEGIN{FS="#"}{print $1}' progreport programing report 123.4 Linux vine 4567 knoppix filter java c 567 awk hogehoge foofoo * 出力レコード区切り子の制御 [#g6c505a5] printで改行してくれますが、これをORSで変更できます。 $ awk 'BEGIN{ORS="#"}{print $1}' progreport programing#Linux#java#hogehoge# * 入力レコード区切り子の制御 [#f61adbf7] デフォルトでは改行で1行とみなしていますが、RSで変更できます。空行で区切るときはRS="" $ awk 'BEGIN{RS="#"}{print $5}' progreport vine * 今まで読み込んだ行数 [#dcbe9a92] NRはそのときの行番号としても使えますが、正確には読み込んだ行数ですので ENDで使えばファイル内の行数となります。 $ awk 'END{print NR}' progreport 4 * 項の数 [#d0f99b8c] NFはそれぞれの行に存在する項の数を保持します。 $ awk '{print NF}' progreport 3 5 4 2 * 現在のファイルから読み込んだ行数 [#s614b3fb] FNRはNRとは違い読み込むファイルが変われば値がクリアされます。 $ awk '{print FNR, NR}' progreport progreport 1 1 2 2 3 3 4 4 1 5 2 6 3 7 4 8 * 現在のファイル名 [#ecb3e9e4] FILENAME現在のファイル名を保持します。ファイルが変われば変更されます。 $ awk '{print FILENAME}' progreport progreport progreport progreport progreport * コマンドライン引数の数 [#yb99c45a] ARGCはコマンドライン引数の数を保持します。オプション等含まない。 $ awk 'BEGIN{print ARGC}' progreport 2 * コマンドライン引数の値 [#h8a72cca] ARGV[0],ARGV[1]など $ awk 'BEGIN{print ARGV[0], ARGV[1]}' progreport awk progreport * 数値から文字列に変換するときのフォーマット [#y04f0eaa] CONVFMTで変更する。デフォルトは"%.6g"。 $ awk 'BEGIN{CONVFMT="%2.2f"; a=12.1234; printf a}' 12.12 * printにおいて数値から文字列に変換するときのフォーマット [#i9c45ca5] OFMTはCONVFMTt違い、printのときに適用されるフォーマット。 $ awk 'BEGIN{OFMT="%2.2f"; a=12.1234; print a}' 12.12 * 多次元配列のインデックスを結合する文字 [#d3f757af] SUBSEPですが、デフォルトは"\034"となっています。 a["pro", "report"]なら"pro\034report"となります。以下はインデックスが"pro#report"となったために表示されません。 $awk 'BEGIN{a["pro","report"]=1;SUBSEP="#";print a["pro","report"]}' * PCの環境変数を保持している連想配列 [#tb10172a] ENVIRONのインデックスに環境変数の名前を入れるとその値がパスになっている。 $ awk 'BEGIN{print ENVIRON["HOME"]}' /home/progreport * match関数で一致した文字数 [#t2fd251b] RLENGTHは正規表現を使ったときは最長の値になります。一致しなかったときは-1 $ awk 'BEGIN{match("progreport", "ogre"); print RLENGTH}' 4 * match関数で一致した部分文字列の開始位置 [#ne29359f] RSTARTで、一致しなかったときは0になります。 $ awk 'BEGIN{match("progreport", "ogre"); print RSTART}' 3