範囲内の使っていない数字を求める
MIN_VALUE=800 MAX_VALUE=810
という数字の範囲で、以下のファイルから使っていない数字を求めるというものです。
#> cat all_values 100 200 800 801 803 900
以下のようなコードを書いたので、最適化してくれまいかということです。
#> nawk -v MIN_VALUE=$MIN_VALUE -v MAX_VALUE=$MAX_VALUE '{ if(($1 >= MIN_VALUE) && ($1 <= MAX_VALUE)) { VAL[$1] = $1 ; } } END { for (i=MIN_VALUE ; i<=MAX_VALUE ; i++) { if (VAL[i] == "") { print "result: " i ; exit ; } } }' all_values result: 802
つまり変数の使用を確認するということに落とし込めば以下のような awk の使い方にできます。
if (VAL[i] == "") {
とか
if (i in VAL) {
といったものです。
あと範囲内の計算をするライブラリとして以下のようなものもあるそうです。awk でも最大級のスクリプトかも?
- 範囲内の計算
- 上記を使った例
全体をまとめたものが以下のものです。
$ awk -v MIN_VALUE=$MIN_VALUE -v MAX_VALUE=$MAX_VALUE ' BEGIN{ for(i=MIN_VALUE;i<MAX_VALUE;i++){a[i]} } MIN_VALUE>$1{next} MAX_VALUE<$1{next} {delete a[$1]} END{ for(f in a){ print f; exit} } ' all_values 802
nawk -v MIN_VALUE=$MIN_VALUE -v MAX_VALUE=$MAX_VALUE ' $1 >= MIN_VALUE && $1 <= MAX_VALUE { VAL[$1] } END { for (i = MIN_VALUE; i in VAL; i++) ; # nothing to do here, just iterate if (i <= MAX_VALUE) # or simply print i without if(), print i # depending on requirements if # all positions already occupied } '