2つのフィールドの間に欠落している項目の新しい行を追加する方法

2つのフィールドの間に欠落している項目の新しい行を追加する方法

このファイルがあります。列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

おすすめ記事