정수 계열이 엄격하게 증가하는지 테스트

정수 계열이 엄격하게 증가하는지 테스트

bash 스크립트를 사용하여 정수 값 목록(예: 파일에 저장됨, 한 줄에 하나씩)이 엄격하게 증가하는지 테스트하고 싶습니다.

이를 달성하는 쉽고 간결한 방법이 있습니까?

답변1

숫자로 정렬하고 중복된 줄을 필터링한 후에도 파일 내용이 변경되지 않은 상태로 유지되는지 확인하세요.

cmp file <(sort -n file | uniq)

최소한 GNU는 sort이 검사를 직접 수행할 수 있습니다:

sort -c -u -n file

(이것POSIXsort문서에도 이에 대해 언급되어 있으므로 모든 곳에서 지원되어야 합니다. )

답변2

즉, 각 행이 십진 정수인지 확인합니다. 즉, 이전 행의 십진 정수에 1을 더한 후 다음을 수행합니다.

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

하나가 아닌 값이 엄격하게 증가하는지 확인하려면 $0 != n+1다음으로 바꾸십시오 . $0 <= n하지만 이 경우에는 선호할 수도 있습니다.sort -c방법첫 번째 잘못된 순서에서 읽기를 중지하거나 지원되지 않는 숫자 형식(16진수, 부동 소수점 표현...)을 지원하려는 경우가 아니면 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

관련 정보