整数系列が厳しく増加するかどうかテスト

整数系列が厳しく増加するかどうかテスト

bashスクリプトを使用して、整数値リスト(ファイルに保存され、1行に1つずつ)が厳しく増加するかどうかをテストしたいと思います。

これを達成する簡単で簡潔な方法はありますか?

答え1

数字で並べ替え、重複した行をフィルタリングしても、ファイルの内容が変更されていないことを確認してください。

cmp file <(sort -n file | uniq)

少なくともGNUはsortこのチェックを直接行うことができます:

sort -c -u -n file

(これPOSIXsort文書にもこれについて言及されているので、どこでもサポートする必要があります。 )

答え2

つまり、各行が10進整数であることを確認します。つまり、前の行の10進整数に1を加算してから、次のようにします。

awk 'NR == 1 {n = $0; next}
     $0 != n+1 {status = 1; exit}
     {n = $0}
     END {exit status}'

1つ以外の値が厳しく増加することを確認するには、$0 != n+1次のように置き換えます。$0 <= nしかし、この場合は好むかもしれません。sort -c方法最初の誤った順序で読み取りを停止したり、サポートされていない数値形式(16進数、浮動小数点表現...)をサポートしたい場合以外sort(ソートがサポートされていない場合-g

答え3

そしてawk

awk 'length(p)&&++p!=$0{print "Not OK";exit};{p=$0}' file

1行に1つずつ追加してください。現在の値が前の値より大きいことを確認するには:

awk 'length(p)&&++p<=$0{print "Not OK";exit};{p=$0}' file

答え4

非常に簡潔なバージョンは次のとおりです。

#!/bin/bash
awk 'NR > 1 && $1 < prev { printf( "error at line %d\n", NR); exit; } { prev = $1 } '  $1

この簡潔でないコードは

#!/bin/bash
l=1     #line number count
p=0     #previous line value
for f in `cat $1`
do
    if [ \( "$f" -lt "$p" \) -a \( "$l" -ne "1" \) ]   #chk for all lines, except first
        then    echo "$f is less than $p on Line $l"
        break
    else
        p=$f  #set previous
    fi
    l=$(expr $l + 1)   #increment line number
done

関連情報