Teste se séries inteiras estão estritamente aumentando

0

Gostaria de testar se uma lista de valores inteiros (por exemplo, armazenados em um arquivo, um por linha) está aumentando estritamente, usando um script bash.

Existe alguma maneira simples / concisa de conseguir isso?

    
por fiddler 25.06.2015 / 11:32

4 respostas

5

Verifique se o conteúdo do arquivo permanece o mesmo depois de ordenar numericamente e filtrar as linhas duplicadas:

cmp file <(sort -n file | uniq)

Pelo menos o GNU sort pode fazer essa verificação diretamente:

sort -c -u -n file

(A documentação do POSIX sort menciona isso também, por isso deve ser suportado em todos os lugares. )

    
por 25.06.2015 / 11:37
2

Se você quer dizer, verifique se cada linha é um inteiro decimal que é um mais o inteiro decimal na linha anterior, então:

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

Substitua o $0 != n+1 por $0 <= n para verificar se há aumento estrito em qualquer valor, não apenas em um. Nesse caso, você provavelmente preferirá a sort -c abordagem a menos que você queira que ela pare de ler na primeira desordem , ou você deseja suportar formatos numéricos (hexadecimais, notação de ponto flutuante ...) não suportados por sort (como quando sua classificação não suporta -g )

    
por 25.06.2015 / 11:49
1

com awk :

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

para aumentar um por linha. Para verificar se a corrente é maior que a anterior:

awk 'length(p)&&++p<=$0{print "Not OK";exit};{p=$0}' file
    
por 25.06.2015 / 11:47
0

A versão extremamente concisa seria algo assim

#!/bin/bash
awk 'NR > 1 && $1 < prev { printf( "error at line %d\n", NR); exit; } { prev = $1 } '  $1

Este código não conciso seria

#!/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
    
por 25.06.2015 / 11:58

Tags