データファイル内の欠落した連番を見つける

データファイル内の欠落した連番を見つける

特定の列に「連番」(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
[...]

関連情報