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