スクリプトの実行順序 (その 5) for 文

for 文

for 文の形式:

for(変数の初期化; 変数に関する条件式; 変数のインクリメントあるいはデクリメント){
  処理
}

scpt14_1.awk

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

BEGIN{
    for(i = 1; i <= 100; i++){
	sum += i
    }
    print "1 から 10 までの合計は " sum
}

scpt14_1.awk の実行結果は:

[cactus:~/code_awk/tuts]% ./scpt14_1.awk
1 から 10 までの合計は 5050

scpt14_2.awk

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

BEGIN{
    for(i = 1; i <= 10; i += 2){
	print "i = " i
    }
}

scpt14_2.awk の実行結果は:

[cactus:~/code_awk/tuts]% ./scpt14_2.awk
i = 1
i = 3
i = 5
i = 7
i = 9

scpt14_3.awk

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

BEGIN{
    for(i = 10; i >= 1; i--){
	print "i = " i
    }
}

scpt14_3.awk の実行結果は:

[cactus:~/code_awk/tuts]% ./scpt14_3.awk
i = 10
i = 9
i = 8
i = 7
i = 6
i = 5
i = 4
i = 3
i = 2
i = 1

繰り返しからの脱出, 繰り返しの処理の一部省略

data14_4.txt

不要な部分
不要な部分
不要な部分
不要な部分
不要な部分
■ ■  これも不要
本文 1
本文 2
本文 3
本文 4
本文 5

scpt14_4.awk

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

FNR == 1{
    for(i = 1; i < 10; i++){
	if($0 ~/^■ ■ /){
	    getline # 冒頭に ■ ■  がきたので次の行を読み
	    break # ループを抜ける
	}
	getline
    }
}

{
    print
}

scpt14_4.awk の実行結果は:

[cactus:~/code_awk/tuts]% ./scpt14_4.awk data14_4.txt
本文 1
本文 2
本文 3
本文 4
本文 5

continue

次のような文字列と数が入り混じったテキスト scpt14_5.txt がある. ここから純粋な数, 即ち数字の連続したもの以外を引用符 [“] で括り, コンマ区切りで出力する

data14_5.txt

tomato トマト 100 300 リンゴ 57 林
たまご 909 国会 350 189 雪 43 財布
自動車 56.7 78.9 先生 C言語
市場 apple google 23.2 D言語

scpt14_5.awk

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

{
    s = ""
    i = 0
    while(i < NF){
	i++
	if($i ~ /^[0-9]+$/){
	    continue
	}
	s = s "\"" $i "\","
    }
    print substr( s, 1, length(s) - 1 ) # 最後のコンマを削除して出力
}

scpt14_5.awk の実行結果は:

[cactus:~/code_awk/tuts]% ./scpt14_5.awk data14_5.txt
"tomato","トマト","リンゴ","林"
"たまご","国会","雪","財布"
"自動車","56.7","78.9","先生","C言語"
"市場","apple","google","23.2","D言語"