Encontrar um número sequencial ausente em um arquivo de dados

Encontrar um número sequencial ausente em um arquivo de dados

Como posso pesquisar um arquivo grande com 'números sequenciais' (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 e depois é redefinida para um. Neste ponto 1 é adicionado à coluna 5.

Uma saída limpa apenas iteraria até o final do arquivo. Como posso encontrar dados ausentes, 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 2?

Gostaria do número/localização da linha antes ou depois dos dados ausentes como a saída desejada.

Esta resposta no Stack Overflowme deu a ideia de usar awk. Então o que eu descobri é:

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 do loop de chegar a 16 e voltar a 1.

Responder1

$ 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 "%" (resto da divisão), você pode brincar com este trecho do 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
[...]

informação relacionada