このファイルがあります。列1に示すように、TEST01N03、TEST01N06、およびTEST01N18項目がありません(合計18項目)。この列のフィールドを確認し、不足している項目を埋める方法はありますか?
TEST01N01 40 2002 2697 2523
TEST01N02 40 4 4 5
TEST01N04 40 4 4 5
TEST01N05 40 4 4 5
TEST01N07 40 4 4 5
TEST01N08 40 1 4 5
TEST01N09 40 4 4 5
TEST01N10 40 4 4 5
TEST01N11 40 2002 2621 2617
TEST01N13 40 1 4 5
TEST01N14 40 1 4 5
TEST01N15 40 1 4 5
TEST01N16 40 1 4 5
TEST01N17 40 2002 2576 2515
出力は次のようになります。
TEST01N01 40 2002 2697 2523
TEST01N02 40 4 4 5
TEST01N03 empty
TEST01N04 40 4 4 5
TEST01N05 40 4 4 5
TEST01N06 empty
TEST01N07 40 4 4 5
TEST01N08 40 1 4 5
TEST01N09 40 4 4 5
TEST01N10 40 4 4 5
TEST01N11 40 2002 2621 2617
TEST01N12 empty
TEST01N13 40 1 4 5
TEST01N14 40 1 4 5
TEST01N15 40 1 4 5
TEST01N16 40 1 4 5
TEST01N17 40 2002 2576 2515
TEST01N18 empty
これを行うためのスクリプト提案をありがとうございます。
ベストアンサー1
解決策は次のとおりですperl
。
$ perl -anle 'BEGIN {$pattern = "TEST01N"}
$curr = $F[0] =~ s/$pattern//r;
if ($prev and ++$prev != $curr) {
printf "%s%02d empty\n", $pattern, $prev;
redo;
}
$prev = $curr;
print;
' file
TEST01N01 40 2002 2697 2523
TEST01N02 40 4 4 5
TEST01N03 empty
TEST01N04 40 4 4 5
TEST01N05 40 4 4 5
TEST01N06 empty
TEST01N07 40 4 4 5
TEST01N08 40 1 4 5
TEST01N09 40 4 4 5
TEST01N10 40 4 4 5
TEST01N11 40 2002 2621 2617
TEST01N12 empty
TEST01N13 40 1 4 5
TEST01N14 40 1 4 5
TEST01N15 40 1 4 5
TEST01N16 40 1 4 5
TEST01N17 40 2002 2576 2515
説明する
- 現在の列インデックスを取得し、変数に保存します。
$curr
$prev
設定されていて、その値に1を加えた値が等しくない場合は、項目が欠落していることを意味します。その項目を印刷し、同じになる$curr
まで最初からやり直してください。$prev
$curr
- 割り当て
$curr
。$prev
- この行を印刷してください。
修正する
@Babyyのコメントに関しては、次のことを試すことができます。
$ perl -anle 'BEGIN {$pattern = "TEST01N"}
$curr = $F[0] =~ s/$pattern//r;
if ($. == 1 and (0+$curr) != ++$i) {
printf "%s%02d empty\n", $pattern, $i;
redo;
}
if ($prev and ++$prev != $curr) {
printf "%s%02d empty\n", $pattern, $prev;
redo;
}
$prev = $curr;
print;
' file