範囲内の使っていない数字を求める


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
   }
'