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