Encontrando um número seqüencial faltando em um arquivo de dados

1

Como posso pesquisar um arquivo grande com 'números seqüenciais' (que são redefinidos após 16) em uma coluna específica para encontrar uma linha ausente?

Eu tenho um arquivo de dados:

col1 col2 col3 col4 col5 1
col1 col2 col3 col4 col5 2
.
.
.
col1 col2 col3 col4 col5 15
col1 col2 col3 col4 col5 16
col1 col2 col3 col4 col5+1 1

onde a última coluna conta de 1 a 16, redefine novamente para um. Neste ponto, 1 é adicionado à coluna 5.

Uma saída limpa seria apenas iterar até o final do arquivo. Como posso encontrar dados perdidos, por exemplo,

col1 col2 col3 col4 col5 1
col1 col2 col3 col4 col5 3

onde uma linha foi ignorada / perdida como pode ser visto na última coluna que pulou o valor de 2?

Eu gostaria que o número da linha / localização da linha antes ou depois dos dados ausentes fosse a saída desejada.

Esta resposta no Stack Overflow me deu a ideia de usar awk . Então, o que eu tenho é:

awk '$6!=p+1{print NR}{p=$6}'

Para tentar imprimir o número da linha atual quando a coluna 6 da linha atual não for igual à coluna 6 da última linha +1. Isso falha devido à natureza em loop de chegar a 16 e voltar a 1.

    
por Christopher 25.10.2016 / 17:10

1 resposta

6
$ cat -n file
 1  col1 col2 col3 col4 col5 14
 2  col1 col2 col3 col4 col5 15
 3  col1 col2 col3 col4 col5 16
 4  col1 col2 col3 col4 col5 1
 5  col1 col2 col3 col4 col5 2
 6  col1 col2 col3 col4 col5 15
 7  col1 col2 col3 col4 col5 16
 8  col1 col2 col3 col4 col5 4
 9  col1 col2 col3 col4 col5 5

$ awk '{if (p % 16 + 1 != $6) printf("line %d is bad: %s\n", NR, $0); p=$6}' file
line 1 is bad: col1 col2 col3 col4 col5 14
line 6 is bad: col1 col2 col3 col4 col5 15
line 8 is bad: col1 col2 col3 col4 col5 4

Para entender o valor do operador de módulo "%" (divisão restante), você pode brincar com este snippet awk:

$ yes | head -n 40 | awk '{x=NR-1; print x, "->", x % 16}'
0 -> 0
1 -> 1
2 -> 2
[...]
14 -> 14
15 -> 15
16 -> 0
17 -> 1
18 -> 2
[...]
    
por 25.10.2016 / 17:32

Tags