Perl 在不连续表中生成缺少的值
一个文件包含多个表。每个表有三列,由选项卡分隔 第一列包含不连续的序列号。我想用第二列和第三列0打印缺少的序列号 输入文件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
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:不,它不是,它是一个非常糟糕的程序。我选择这样回答是因为你不会回答我的问题或描述