Como verificar se a lista de números está ordenada?

6

Como verificar se os números do arquivo de lista estão aumentando?

Lista de exemplos1:

658
659
663

vai ficar "OK".

Lista de exemplos2:

658
664
663

receberá "FAIL".

Lista de exemplos3:

23
24
25
26

vai ficar "OK".

    
por jango 30.01.2018 / 14:01

3 respostas

13

Você pode usar sort -nc filename para validar se o arquivo está em ordem incremental ou não (contendo apenas números).

sort -n -c filename >/dev/null 2>&1 && echo "OK" || echo "FAIL"

Ou resumindo (anote o% superior-C " like -c, but do not report first bad line "), usando também a opção -u para verificar uma ordem estritamente crescente, bem como a opção -g para ter mais formatos numéricos a serem suportados (como +2 , 0x10 , 1.2e+3 , infinity , ...) sugerido por @ StéphaneChazelas :

sort -guC filename && echo "OK" || echo "FAIL"

Observação: se você não quiser denunciar "FAIL" nos mesmos números repetidos, omita a opção -u acima.

    
por 30.01.2018 / 14:41
7
awk 'BEGIN {res = "OK"}
     NR > 1 && $1 <= prev {res = "Fail"; exit}
     {prev = $1}
     END {print res}'  file

Esta solução awk deve funcionar. Defina a variável res para OK desde o início e, em seguida, verifique o primeiro campo delimitado por espaço no arquivo em relação à variável prev . Se esta linha $1 for menor que a anterior, defina res para Fail e pare de ler. Finalmente, no final do script, imprima a variável res .

    
por 30.01.2018 / 14:13
3

Outro truque com o comando join :

join --check-order file file &>/dev/null && echo "OK" || echo "FAIL"

Testes:

$ cat a1
11
33
22
$ join --check-order a1 a1 &>/dev/null && echo "OK" || echo "FAIL"
FAIL
$ cat a2
11
22
33
$ join --check-order a2 a2 &>/dev/null && echo "OK" || echo "FAIL"
OK
    
por 30.01.2018 / 15:11

Tags