Perl 在不连续表中生成缺少的值

Perl 在不连续表中生成缺少的值,perl,sed,awk,Perl,Sed,Awk,一个文件包含多个表。每个表有三列,由选项卡分隔 第一列包含不连续的序列号。我想用第二列和第三列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

一个文件包含多个表。每个表有三列,由选项卡分隔

第一列包含不连续的序列号。我想用第二列和第三列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
Pos-freq分类
13    1       4
14    2       3
17    5       2

20 3 2以防您对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

$join-a2-j1-t$'\t'输入文件以防您对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

$join-a2-j1-t$'\t'输入文件以防您对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

$join-a2-j1-t$'\t'输入文件以防您对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

$join-a2-j1-t$'\t'输入文件
$awk-F'\t'-v OFS=“\t”!p{p=$1-1}++p
$awk-F'\t'-vofs=“\t”!p{p=$1-1}++p
$awk-F'\t'-vofs=“\t”!p{p=$1-1}++p
$awk-F'\t'-vofs=“\t”!p{p=$1-1}++p这个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;
}
使用严格;
使用警告;
我的$seq;
而(){
如果(/((\s*)(\d+))/x){
如果(定义为$seq){
printf“%s%d\t0\t0\n”,$2,$u表示$seq+1..$3-1;
}
$seq=$3;
}
否则{
$seq=未定义;
}
印刷品;
}
输出

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
Pos-freq分类
13    1       4
14    2       3
15  0 0
16  0 0
17    5       2
18  0 0
19  0 0

20 3 2此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;
}
使用严格;
使用警告;
我的$seq;
而(){
如果(/((\s*)(\d+))/x){
如果(定义为$seq){
printf“%s%d\t0\t0\n”,$2,$u表示$seq+1..$3-1;
}
$seq=$3;
}
否则{
$seq=未定义;
}
印刷品;
}
输出

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
Pos-freq分类
13    1       4
14    2       3
15  0 0
16  0 0
17    5       2
18  0 0
19  0 0

20 3 2此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;
}
使用严格;
使用警告;
我的$seq;
而(){
如果(/((\s*)(\d+))/x){
如果(定义为$seq){
printf“%s%d\t0\t0\n”,$2,$u表示$seq+1..$3-1;
}
$seq=$3;
}
否则{
$seq=未定义;
}
印刷品;
}
输出

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
Pos-freq分类
13    1       4
14    2       3
15  0 0
16  0 0
17    5       2
18  0 0
19  0 0

20 3 2此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;
}
使用严格;
使用警告;
我的$seq;
而(){
如果(/((\s*)(\d+))/x){
如果(定义为$seq){
printf“%s%d\t0\t0\n”,$2,$u表示$seq+1..$3-1;
}
$seq=$3;
}
否则{
$seq=未定义;
}
印刷品;
}
输出

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
Pos-freq分类
13    1       4
14    2       3
15  0 0
16  0 0
17    5       2
18  0 0
19  0 0

20 3 2到目前为止,您是否编写了可以发布的代码?您发布的数据中没有选项卡。第一列中的数字前面真的有空格吗?制表符后是否有一行的
,第一列中的数字前是否有空格?正确设置数据格式是很重要的,这是不可能猜测的。到目前为止,您是否编写了可以发布的代码?发布的数据中没有选项卡。第一列中的数字前面真的有空格吗?制表符后是否有一行的
,第一列中的数字前是否有空格?正确设置数据格式是很重要的,这是不可能猜测的。到目前为止,您是否编写了可以发布的代码?发布的数据中没有选项卡。第一列中的数字前面真的有空格吗?制表符后是否有一行的
,第一列中的数字前是否有空格?正确设置数据格式是很重要的,这是不可能猜测的。到目前为止,您是否编写了可以发布的代码?发布的数据中没有选项卡。第一列中的数字前面真的有空格吗?制表符后是否有一行的
,第一列中的数字前是否有空格?正确设置数据格式很重要,而且不可能猜测。@FIROZ:不,不是,这是一个非常糟糕的程序。我选择这样回答是因为你不会回答我的问题或正确描述你的数据。我没想到会被认真对待。请把你的一些真实数据放在上面,这样我可以提高我的英语水平code@FIROZ:不,它不是,它是一个非常糟糕的程序。我选择这样回答是因为你不会回答我的问题或正确描述你的数据。我没想到会被认真对待。请把你的一些真实数据放在上面,这样我可以提高我的英语水平code@FIROZ:不,它不是,它是一个非常糟糕的程序。我选择这样回答是因为你不会回答我的问题或描述