我想使用 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