awk の配列

scpt16_1.awk

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/usr/local/bin/gawk -f
# scpt16_1.awk

BEGIN{
    name[1] = "太郎"
    name[2] = "次郎"
    name[3] = "三郎"
    for(i = 1; i <= 3; i++)
	print name[i]
}

scpt16_1.awk の実行結果は:

[cactus:~/code_awk/tuts]% ./scpt16_1.awk
太郎
次郎
三郎

data16_2.txt

和田 90
河野 34
宮城 60
宮里 23
高良 76
志村 33
中村 86
松生 45
岡崎 78
長田 59

scpt16_2.awk

#!/usr/local/bin/gawk -f
# scpt16_2.awk

{
    name[FNR] = $1 # FNR は入力するたびに増えていく
    point[FNR] = $2
}

END{
    print "----- 合格 -----"
    for(i = 1; i <= FNR; i++){
	if(point[i] >= 60)
	    print name[i] "\t" point[i]
    }

    print "----- 不可 -----"
    for(i = 1; i <= FNR; i++){
	if(point[i] < 60)
	    print name[i] "\t" point[i]
    }
    
}

scpt16_2.awk の実行結果は:

[cactus:~/code_awk/tuts]% ./scpt16_2.awk data16_2.txt
----- 合格 -----
和田  90
宮城  60
高良  76
中村  86
岡崎  78
----- 不可 -----
河野  34
宮里  23
志村  33
松生  45
長田  59

split 関数

split(str, array, sep) のように引数 を三つ受け取る. 動作は, 区切文字 sep を用いて, str を 配列 array に分割し, そのの要素数を返す.

もし sep が省略されれば, 現在のフィールド・セパレータ FS が用いられる:

split(str, array, sep)

str: 元の文字列
array: 配列
sep: 区切り文字
返値: 配列の要素数

例をあげよう. 例えば, ディレクトリ名も含んだ長いファイル名を, ディレクトリ名と短いファイル名に分割できる.

scpt16_3.awk

#!/usr/local/bin/gawk -f
# scpt16_3.awk

BEGIN{
    longfn = "/Users/Wtopia/code_awk/tuts/scpt16_3.awk"
    num = split(longfn, arr, "/")

    for(i = 1; i <= num; i++) # 配列を出力
	print "arr[" i "]=" arr[i]
}

scpt16_3.awk の実行結果は:

[cactus:~/code_awk/tuts]% pwd
/Users/Wtopia/code_awk/tuts
[cactus:~/code_awk/tuts]% ./scpt16_3.awk
arr[1]=
arr[2]=Users
arr[3]=Wtopia
arr[4]=code_awk
arr[5]=tuts
arr[6]=scpt16_3.awk
[cactus:~/code_awk/tuts]% cp ./scpt16_3.awk ~/code_py/sphinx/awk_tuts/

たとえばあるファイルを処理しているときに, 処理結果の最初に短いファイル名をつけたいという場合は以下のようにする. 現在の入力ファイル名 (ディレクトリも含むフルパス名) は FILENAME という組み込み変数に入っているので, それに, split 関数を適用する.

scpt16_4.awk

#!/usr/local/bin/gawk -f
# scpt16_4.awk

FNR == 1{
    num = split(FILENAME, arr, "/")
    shortfn = arr[num] # 配列の最後の要素がファイル名
    print shortfn
}

{
    print $0
}

scpt16_4.awk の実行結果は:

[cactus:~/code_awk/tuts]% ./scpt16_4.awk data16_4.txt
data16_4.txt
和田 90
河野 34
宮城 60
宮里 23
高良 76
志村 33
中村 86
松生 45
岡崎 78
長田 59

Table Of Contents

Previous topic

スクリプトの実行順序 (その 6) next と exit

Next topic

awk の連想配列