
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
AWK
soluçã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 -n
para encontrar o número da linha dessas linhas incorretas.