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(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