データファイルから欠落しているシリアル番号を探す

データファイルから欠落しているシリアル番号を探す

不足している行を見つけるために、特定の列で「シリアル番号」(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の最後の列に示すように、行の1つがスキップまたは失われましたか?

欠落しているデータの前後の行番号/位置を希望の出力にします。

スタックオーバーフローに対するこの回答私に使用するアイデアを与えました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
[...]

関連情報