Verificando se um arquivo de texto tem todas as entradas e está formatado corretamente

0

Eu tenho um arquivo que é assim

0001;4;5;30;33;41;52
0002;9;37;39;41;43;49
0003;10;11;29;30;36;47
0004;1;5;6;27;42;59
0005;1;2;6;16;19;46
0006;7;13;19;22;40;47
0007;3;5;20;21;38;56
... etc

O primeiro número é um contador e os seis seguintes são números de 1 ou 2 dígitos.

O arquivo tem milhares de linhas como esta. Começa em 1 e vai para 9999.

Existe uma maneira de verificar se há uma linha faltando? Quer dizer, se todos os números estão presentes desde o da primeira linha até o da última linha?

Quero dizer assim:

0001;4;5;30;33;41;52      // first line
0002;9;37;39;41;43;49
0003;10;11;29;30;36;47
...
9999;3;4;8;12;55;88       // last line

há alguma linha faltando entre 0001 e 9999?

Suponha isso:

0001;4;5;30;33;41;52     
0002;9;37;39;41;43;49
0003;10;11;29;30;36;47
0004;1;5;6;27;42;59
0006;7;13;19;22;40;47

ver? 0005 está faltando.

Como bônus, seria bom verificar se todos os sete números são delimitados por ; e nenhum outro caractere.

Obrigado

    
por SpaceDog 02.12.2017 / 13:08

2 respostas

3
Solução

AWK (assumindo o seu se imprimir o primeiro como está ok ):

Exemplo de arquivo input.csv :

0001;4;5;30;33;41;52
0002;9;37;39;41;43;49
0003;10;11;29;30;36;47
0005;1;2;6;16;19;46
0006;7;13;19;22;40;47
0007;3;5;20;21;38;56
0008;1;5,6;27;42;59
0009;10;1;6;27;42;59

para condição para verificar se há uma linha faltando :

awk -F';' 'NR!=int($1){ printf "%04d is missing\n",NR; exit }' input.csv

A saída:

0004 is missing

para condição para verificar se todos os números sete são delimitados por ; :

awk -F';' 'NF!=7{printf "Incorrect number of fields: %d on record %d\n",NF,NR; exit}' input.csv

A saída:

Incorrect number of fields: 6 on record 7
    
por 02.12.2017 / 13:24
1

Além da resposta aceita, para encontrar qualquer linha com um caracter indesejado:

grep '[^0-9;]' filename

, que produzirá qualquer linha no arquivo que contenha um caractere que não seja um número ou um ponto-e-vírgula. Use grep -n para encontrar o número da linha dessas linhas ofensivas.

    
por 02.12.2017 / 22:57