Verificando se um arquivo de texto contém todas as entradas e está formatado corretamente

Verificando se um arquivo de texto contém todas as entradas e está formatado corretamente

Eu tenho um arquivo 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 até 9999.

existe uma maneira de verificar se há uma linha faltando? Quero dizer, se todos os números estiverem 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

falta alguma linha entre 0001 e 9999?

Suponha isto:

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 não por qualquer outro caractere.

Obrigado

Responder1

AWKsolução (assumindo que seuse imprimir o primeiro como está ok):

Arquivo de amostra 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çãopara verificar se há alguma linha faltando:

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

A saída:

0004 is missing

para condiçãopara verificar se tudoSeteos números 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

Responder2

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

grep '[^0-9;]' filename

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

informação relacionada