テキストファイルにすべてのエントリがあり、正しくフォーマットされているかどうかを確認する

テキストファイルにすべてのエントリがあり、正しくフォーマットされているかどうかを確認する

このようなファイルがあります

0001;4;5;30;33;41;52
0002;9;37;39;41;43;49
0003;10;11;29;30;36;47
0004;1;5;6;27;42;59
0005;1;2;6;16;19;46
0006;7;13;19;22;40;47
0007;3;5;20;21;38;56
... etc

最初の数字はカウンターで、次の 6 つは 1 桁または 2 桁の数字です。

ファイルにはこのような行が何千行もあります。1 から始まり、9999 まで続きます。

行が欠落しているかどうかを確認する方法はありますか? つまり、最初の行の数字から最後の行の数字まで、すべての数字が存在するかどうかということです。

つまり、次のようになります。

0001;4;5;30;33;41;52      // first line
0002;9;37;39;41;43;49
0003;10;11;29;30;36;47
...
9999;3;4;8;12;55;88       // last line

0001 と 9999 の間に欠落している行はありますか?

次のような状況を想定します。

0001;4;5;30;33;41;52     
0002;9;37;39;41;43;49
0003;10;11;29;30;36;47
0004;1;5;6;27;42;59
0006;7;13;19;22;40;47

わかりますか?0005がありません。

;ボーナスとして、7 つの数字すべてが で区切られており、他の文字で区切られていないかどうかを確認するとよいでしょう。

ありがとう

答え1

AWK解決策(あなたの最初のように印刷されればOK):

サンプルファイルinput.csv:

0001;4;5;30;33;41;52
0002;9;37;39;41;43;49
0003;10;11;29;30;36;47
0005;1;2;6;16;19;46
0006;7;13;19;22;40;47
0007;3;5;20;21;38;56
0008;1;5,6;27;42;59
0009;10;1;6;27;42;59

条件について行が抜けていないか確認する:

awk -F';' 'NR!=int($1){ printf "%04d is missing\n",NR; exit }' input.csv

出力:

0004 is missing

条件についてすべてを確認するセブン数字は;:

awk -F';' 'NF!=7{printf "Incorrect number of fields: %d on record %d\n",NF,NR; exit}' input.csv

出力:

Incorrect number of fields: 6 on record 7

答え2

受け入れられた回答に加えて、不要な文字を含む行を見つけるには、次のようにします。

grep '[^0-9;]' filename

ファイル内の数字またはセミコロン以外の文字を含む行を出力します。 を使用して、grep -n問題のある行の行番号を見つけます。

関連情報