测试整数级数是否严格递增

测试整数级数是否严格递增

我想使用 bash 脚本测试整数值列表(例如存储在文件中,每行一个)是否严格增加。

有没有简单/简洁的方法来实现这一目标?

答案1

检查按数字排序并过滤重复行后文件内容是否保持不变:

cmp file <(sort -n file | uniq)

至少GNUsort可以直接做这个检查:

sort -c -u -n file

(这POSIXsort文档也提到了这一点,因此应该在所有地方都支持它。)

答案2

如果您的意思是,检查每一行是否都是十进制整数,即前一行中的十进制整数加一,那么:

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

将 替换$0 != n+1$0 <= n以检查是否严格增加任何值,而不仅仅是一个值。但在这种情况下,您可能会更喜欢sort -c方法除非你希望它在第一个无序处停止读取,或者你想要支持不支持的数字格式(十六进制,浮点表示法...)sort(例如当你的排序不支持时-g

答案3

awk

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

每行增加一个。要检查电流是否大于先前的值:

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

相关内容