不足している行を見つけるために、特定の列で「シリアル番号」(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
[...]