在数据文件中查找缺失的序列号

Chr*_*her 1 awk search

如何在特定列中搜索带有“序列号”(在 16 之后重置)的大文件以查找丢失的行?

我有一个数据文件:

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
Run Code Online (Sandbox Code Playgroud)

最后一列从 1 到 16 计数,然后重置为 1。此时将 1 添加到第 5 列。

干净的输出只会迭代到文件末尾。我怎样才能找到丢失的数据,例如

col1 col2 col3 col4 col5 1
col1 col2 col3 col4 col5 3
Run Code Online (Sandbox Code Playgroud)

从跳过值 2 的最后一列可以看出,其中一行已被跳过/丢失?

我想要丢失数据之前或之后的行号/位置作为所需的输出。

Stack Overflow 上的这个答案给了我使用awk. 所以我想出的是:

awk '$6!=p+1{print NR}{p=$6}'

当当前行的第 6 列不等于最后一行的第 6 列 +1 时,尝试打印当前行号。由于到达 16 并返回到 1 的循环性质,这会失败。

rud*_*ier 6

$ 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
Run Code Online (Sandbox Code Playgroud)

要了解模运算符“%”(除法余数)的值,您可以使用以下 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
[...]
Run Code Online (Sandbox Code Playgroud)