¿Cómo puedo buscar un archivo grande con 'números secuenciales' (que se reinician después de 16) en una columna en particular para encontrar una línea faltante?
Tengo un archivo de datos:
col1 col2 col3 col4 col5 1
col1 col2 col3 col4 col5 2
.
.
.
col1 col2 col3 col4 col5 15
col1 col2 col3 col4 col5 16
col1 col2 col3 col4 col5+1 1
donde la última columna cuenta del 1 al 16 y luego se restablece a uno. En este punto se añade 1 a la columna 5.
Una salida limpia simplemente se repetiría hasta el final del archivo. ¿Cómo puedo encontrar datos faltantes, por ejemplo?
col1 col2 col3 col4 col5 1
col1 col2 col3 col4 col5 3
¿Dónde se omitió/perdió una fila como se puede ver en la última columna que omitió el valor de 2?
Me gustaría el número de línea/ubicación de la línea antes o después de los datos faltantes como resultado deseado.
Esta respuesta en Stack OverflowMe dio la idea de usar awk
. Entonces lo que se me ocurrió es:
awk '$6!=p+1{print NR}{p=$6}'
Para intentar imprimir el número de línea actual cuando la columna 6 de la línea actual no es igual a la columna 6 de la última línea +1. Esto falla debido a la naturaleza circular de llegar a 16 y volver a 1.
Respuesta1
$ cat -n file
1 col1 col2 col3 col4 col5 14
2 col1 col2 col3 col4 col5 15
3 col1 col2 col3 col4 col5 16
4 col1 col2 col3 col4 col5 1
5 col1 col2 col3 col4 col5 2
6 col1 col2 col3 col4 col5 15
7 col1 col2 col3 col4 col5 16
8 col1 col2 col3 col4 col5 4
9 col1 col2 col3 col4 col5 5
$ awk '{if (p % 16 + 1 != $6) printf("line %d is bad: %s\n", NR, $0); p=$6}' file
line 1 is bad: col1 col2 col3 col4 col5 14
line 6 is bad: col1 col2 col3 col4 col5 15
line 8 is bad: col1 col2 col3 col4 col5 4
Para entender el valor del operador de módulo "%" (resto de la división), puedes jugar con este fragmento de awk:
$ yes | head -n 40 | awk '{x=NR-1; print x, "->", x % 16}'
0 -> 0
1 -> 1
2 -> 2
[...]
14 -> 14
15 -> 15
16 -> 0
17 -> 1
18 -> 2
[...]