![Encontrar um número sequencial ausente em um arquivo de dados](https://rvso.com/image/97231/Encontrar%20um%20n%C3%BAmero%20sequencial%20ausente%20em%20um%20arquivo%20de%20dados.png)
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
[...]