【问题标题】:Generating missing values in a discontinuous table在不连续表中生成缺失值
【发布时间】:2014-04-12 20:35:09
【问题描述】:

一个文件包含多个表。每个表都有三列,由制表符分隔。

第一列包含不连续的序列号。我想用 0 0 打印第二列和第三列缺少的序列号。

输入文件

Pos freq catagory
    13    1       4
    14    2       3
    17    5       2
    20    3       2 <<<<<
    21    1       4
    25    1       4
Pos freq catagory
    10    1       4
    12    2       3
    13    5       2
    14    3       2 <<<<<
    15    1       4

输出文件

Pos freq catagory
    13    1       4
    14    2       3
    15    0       0
    16    0       0
    17    5       2
    18    0       0
    19    0       0
    20    3       2 <<<<<
    21    1       4
    22    0       0
    23    0       0
    24    0       0
    25    1       4
Pos freq catagory
    10    1       4
    11 0 0 
    12    2       3
    13    5       2
    14    3       2 <<<<<
    15 1 4

您能帮我用 Perl、sed 或 awk 做吗?

【问题讨论】:

  • 到目前为止,您是否编写过任何可以发布的代码?
  • 您发布的数据中没有标签。第一列的数字前真的有空格吗?真实数据中有&lt;&lt;&lt;&lt;&lt;吗?
  • 标签后一行有
  • 第一列的数字前真的有空格吗?正确设置数据格式很重要,而且无法猜测。

标签: perl sed awk


【解决方案1】:

以防万一您对 coreutils+sed 解决方案感兴趣:

$ join -a2 -j1 -t $'\t' input_file <(seq 13 25) | sed 's/^[^[:space:]]*$/&\t0\t0/'
13      1       4
14      2       3
15      0       0
16      0       0
17      5       2
18      0       0
19      0       0
20      3       2
21      1       4
22      0       0
23      0       0
24      0       0
25      1       4

【讨论】:

    【解决方案2】:
    $ awk -F'\t' -v OFS="\t" '!p{p=$1-1}++p<$1{for(p;p<$1;p++)print p,0,0}7' file 
    13  1   4
    14  2   3
    15  0   0
    16  0   0
    17  5   2
    18  0   0
    19  0   0
    20  3   2
    21  1   4
    22  0   0
    23  0   0
    24  0   0
    25  1   4
    

    【讨论】:

      【解决方案3】:

      这个 Perl 程序太长了,因为它试图在填充的数据行中使用原始文件中的间距。如果第一个字段的长度固定且带有前导空格,也会出错。

      是的,我知道编写猜测正确规范的软件是愚蠢的。

      use strict;
      use warnings;
      
      my $seq;
      
      while (<>) {
        if ( / ( (\s*) (\d+) ) /x ) {
          if (defined $seq) {
            printf "%s%d\t0\t0\n", $2, $_ for $seq+1 .. $3-1;
          }
          $seq = $3;
        }
        else {
          $seq = undef;
        }
        print;
      }
      

      输出

      Pos freq catagory
          13    1       4
          14    2       3
          15  0 0
          16  0 0
          17    5       2
          18  0 0
          19  0 0
          20    3       2 <<<<<
          21    1       4
          22  0 0
          23  0 0
          24  0 0
          25    1       4
      Pos freq catagory
          10    1       4
          11  0 0
          12    2       3
          13    5       2
          14    3       2 <<<<<
          15    1       4
      

      【讨论】:

      • @FIROZ:不,不是,这是一个非常糟糕的程序。我选择这样回答是因为您不会回答我的问题或正确描述您的数据。我没想到会被认真对待。请将您的一些真实数据放在pastebin 上,以便我改进我的代码
      猜你喜欢
      • 2021-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      • 2013-05-21
      • 2021-11-08
      相关资源
      最近更新 更多