
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
AWK
solució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 -n
para encontrar el número de línea de estas líneas ofensivas.