![尋找資料檔案中遺失的序號](https://rvso.com/image/97231/%E5%B0%8B%E6%89%BE%E8%B3%87%E6%96%99%E6%AA%94%E6%A1%88%E4%B8%AD%E9%81%BA%E5%A4%B1%E7%9A%84%E5%BA%8F%E8%99%9F.png)
如何在特定列中搜尋帶有「序號」(在 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
[...]