Comprobar si un archivo de texto tiene todas las entradas y tiene el formato correcto

Comprobar si un archivo de texto tiene todas las entradas y tiene el formato correcto

tengo un archivo que es asi

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

El primer número es un contador y los seis siguientes son números de 1 o 2 dígitos.

El archivo tiene miles de líneas como esta. Comienza en 1 y llega a 9999.

¿Hay alguna forma de comprobar si falta una línea? Quiero decir, ¿si todos los números están presentes desde el de la primera línea hasta el de la última línea?

Me refiero a esto:

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 alguna línea entre 0001 y 9999?

Supongamos esto:

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? Falta 0005.

Como beneficio adicional, sería bueno comprobar si los siete números están delimitados por ;algún otro carácter y no por ningún otro.

Gracias

Respuesta1

AWKsolución (suponiendo que susi imprime el primero como si estuviera bien):

Archivo de muestra 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

por condiciónpara comprobar si falta una línea:

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

La salida:

0004 is missing

por condiciónpara comprobar si todosSieteLos números están delimitados por;:

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

La salida:

Incorrect number of fields: 6 on record 7

Respuesta2

Además de la respuesta aceptada, para buscar cualquier línea con un carácter no deseado:

grep '[^0-9;]' filename

que generará cualquier línea en el archivo que contenga un carácter que no sea un número o un punto y coma. Úselo grep -npara encontrar el número de línea de estas líneas ofensivas.

información relacionada