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