如何在perl中基于坐标生成表?

如何在perl中基于坐标生成表?,perl,command-line,Perl,Command Line,我有一个大文件,其中包含许多点、一个位置和一组坐标,如: no pos/neg cordinates 1 + 1 3 2 + 5 8 3 - 10 12 我想做的是首先将间隔的长度转换为点(1-3->1-23) 接下来在一个新列中,每次我有(+)加1,当我有(-)时加1,当我在坐标之外时加0,在另一列中加第二列的和,如下表所示 1 1 1 2 1 2 3 1 3 4 0 3 5 1 4 6 1 5 7 1

我有一个大文件,其中包含许多点、一个位置和一组坐标,如:

no  pos/neg cordinates
1     +     1    3
2     +     5    8
3     -    10   12
我想做的是首先将间隔的长度转换为点(1-3->1-23) 接下来在一个新列中,每次我有(+)加1,当我有(-)时加1,当我在坐标之外时加0,在另一列中加第二列的和,如下表所示

1  1  1
2  1  2
3  1  3
4  0  3
5  1  4
6  1  5
7  1  6
8  1  7
9  0  7
10 -1 -6
11 -1 -5
12 -1 -4
我读到我只能通过使用散列来实现这一点,但由于我对Perl还是新手,所以我不知道如何处理它。起初,我想用命令提示符生成3个文件,然后像粘贴一样粘贴到一个文件中,但技术上有很多困难

例如,使用
sed112
我可以生成第一列,但我不能使用sed链接第二列和第三列,即使我知道如何计算它们

awk 'BEGIN {v=0} {if ($2=="-") {v=v-1} else {v=v+1}; $4=v; print}'
    | awk '{print $0 "\t" (c+=$4"1")}'
没有必要使用perl,因此如果有人知道如何链接这些命令,我将有义务。

[OP声明的期望输出(
10-1-6
)与提供的
awk
代码(
10-16
)产生的输出之间存在差异]。此答案假设OP希望通过提供的
awk
代码生成输出。]

#/usr/bin/perl
严格使用;
使用警告;
使用特征qw(例如);
我的%incs\u按符号=(“+”=>1,“-”=>1);
#跳过标题。
已定义(标量())
或退出;
我的$val=0;
我的$i;
而(){
my(未定义,$sign,$x,$y)=拆分;
如果(定义为($i)){
#填补缺口。

对于(;$i,以下代码读取数据、跳过标题、在空格上拆分行、定义增量值并计算总和

use strict;
use warnings;
use feature 'say';

my $sum   = 0;                          # sum 
my $count = 1;                          # line counter

while(<DATA>){                          # read data
    next if /pos/;                      # skip header
    my($n,$p,$a,$b) = split '\s+';      # split on spaces

    say $_ . "\t0\t$sum" for $count..$a-1; # gap block

    my $i;                              # '+'/'-' increment
    $i =  1 if $p eq '+';               # incremet  by  1 if '+'
    $i = -1 if $p eq '-';               # decrement by -1 if '-'

    for ($a..$b) {                      # pos point coordinates
        $sum += $i;                     # calculate sum
        say "$_\t$i\t$sum";             # output
    }
    $count=$b+1;                        # increment counter for next line
}

__DATA__
no  pos/neg cordinates
1     +     1    3
2     +     5    8
3     -    10   12

输入文件中的坐标是否有序?是的,它们是!!这假设第一个条目的第一个坐标是
1
和/或需要从
1
中反写前导数字。可能需要,也可能不需要。提示:避免使用
$a
$b
作为词汇表。这将破坏
排序
和某些子项s、 这段代码并没有假定任何类型,
$a
$b
可以是其他任何东西——它们被选为字母表的第一个字母,它们可以是
$start
$end
。我知道。就像我说的,你不应该这样做。这是一个坏习惯,因为它们实际上是特殊的变量。它会回来咬你的。ikegami——从来没有听过这么幼稚的事情……哈哈哈……我是编码员还是
月球穿梭机指挥
?答案很多。这两种解决方案都有效,但我会接受@polar bear的答案的唯一原因是,你的答案对我这样的业余爱好者来说有点复杂,但我想说清楚,我真的很喜欢感谢您的时间和帮助。@KGee,第一行的第一个坐标永远是1吗?我的代码有点复杂,因为它不像其他答案那样假设。如果您有什么需要我解释的,请尽管问。有两个主要区别:我使用的是C型循环(您可以在perlsyn perl文档页面中阅读)这样我就不必为同一件事使用三个不同的变量(我的答案中的
$I
称为
$count
,第一个foreach循环的
$\u
,另一个答案中的第二个foreach循环的
$\ucode>),我使用了散列查找而不是多个ifs。你肯定会习惯于使用散列而不是if语句链。再一次,我非常感谢!!!我之所以反应晚是因为我试图理解这个Perl背后的逻辑。我正在打印我正在使用的所有值等。。。
1       1       1
2       1       2
3       1       3
4       0       3
5       1       4
6       1       5
7       1       6
8       1       7
9       0       7
10      -1      6
11      -1      5
12      -1      4