
このファイルがあります。列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
答え2
current
awkから:各入力行を解析してプレフィックスの後ろのインデックスを見つけますTEST01N
。現在の出力ライン番号(n
)がインデックスより小さい場合、入力ラインをコピーする前に欠落しているラインが印刷されます。最後に必要な数に達するには、行を追加してください。
{
i = match($1,/[0-9]+$/);
prefix = substr($1,1,i-1);
current = substr($1,i) + 0;
while (++n < current) printf "%s%02d empty\n", prefix, n;
print;
}
END {
while (++n <= 18) printf "%s%02d empty\n", prefix, n;
}