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

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

如何在特定列中搜索带有“序列号”(在 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

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

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

col1 col2 col3 col4 col5 1
col1 col2 col3 col4 col5 3

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

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

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

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

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

答案1

$ 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

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

相关内容