使用Perl对多列进行算术并打印到输出文件

时间:2014-01-27 12:05:49

标签: perl

我的perl脚本出现问题。我有一个4列的input.txt文件,我想从第二列的每一行中减去100,并在第三列的每一行中加100,并将输出打印到一个单独的文件。我可以获得值OK但它只打印一列中的所有值。

input.txt:

chr1    878656    878657    MACS_peak_1
chr1    912350    912351    MACS_peak_2
chr1    1624598    1624599  MACS_peak_3
chr1    1677888    1677889  MACS_peak_4

我想从第二列中减去100并将第100列添加到第三列,所以它看起来像这样:

chr1    878556    878757
chr1    912250    912451
chr1    1624498    1624699
chr1    1677788    1677989

我一直在使用以下脚本。算术没问题,但每次我将它打印到屏幕上时,我只得到一列数据输出。

use warnings;

unless (open(FILE, "input.txt")){
  print "cannot open file\n\n" ;
  exit;
}

while (<FILE>) {

  chomp($_);

  {
    @input = split(/\t/,$_);
    @input1= split(/\t/,$input[1]);
    @input2= split(/\t/,$input[2]);
    $input1 = $input[1] - 100;
    $input2 = $input[2] + 100;

    {
      print $input1,"\n"; print $input2,"\n";
    }
  }
}

close FILE ;

我知道如何用awk做这件事,但我正在努力学习perl这么新。非常感谢任何建议和解释。

谢谢, 哈丽特

2 个答案:

答案 0 :(得分:2)

use warnings;
use strict; 

open my $input, '<', 'in.txt';

while(<$input>){
    my @split = split(/\s+/);
    my $col1 = ($split[1] - 100);
    my $col2 = ($split[2] + 100);
    print "$split[0]\t$col1\t$col2\n"
}

打印:

chr1    878556  878757
chr1    912250  912451
chr1    1624498 1624699
chr1    1677788 1677989

答案 1 :(得分:2)

既然您正在学习Perl,请查看此单行,看看您是否能理解其工作原理:)

$ perl -lane '$F[1] -= 100; $F[2] += 100; print "@F[0,1,2]"' input.txt

perldoc perlrun应该可以帮助您解读它。