如何在两个字段之间为缺失的条目添加新行

如何在两个字段之间为缺失的条目添加新行

我有这个文件。正如您在第 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

在 awk 中:解析每个输入行以查找前缀current后的索引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;
 }

相关内容