Encontrar un número secuencial faltante en un archivo de datos

Encontrar un número secuencial faltante en un archivo de datos

¿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
[...]

información relacionada