如何在perl中提取特定列?

时间:2017-07-12 09:43:27

标签: perl

chr1    1   10  el1
chr1    13  20  el2
chr1    50  55  el3

我有这个制表符分隔文件,我想使用perl提取第二和第三列。我怎么能这样做?

我尝试使用文件处理程序读取文件并将其存储在字符串中,然后将字符串转换为数组,但它并没有让我随时随地。

我的尝试是:

while (defined($line=<FILE_HANDLE>)) {
    my @tf1;
    @tf1 = split(/\t/ , $line);
}

4 个答案:

答案 0 :(得分:4)

只需在选项卡上自动分割

#                                      ↓ index starts on 0
$ perl -F'\t' -lane'print join ",", @F[1,2]' inputfile

输出:

1,10
13,20
50,55

请参阅perlrun

答案 1 :(得分:1)

use strict;

my $input=shift or die "must provide <input_file> as an argument\n";

open(my $in,"<",$input) or die "Cannot open $input for reading: $!";

while(<$in>)
{
    my @tf1=split(/\t/,$_);
    print "$tf1[1]|$tf1[2]\n"; # $tf1[1] is the second column and $tf1[2] is the third column
}
close($in)

答案 2 :(得分:1)

你有什么问题?你的代码已经完成了所有困难的部分。

while (defined($line=<FILE_HANDLE>)) {
    my @tf1;
    @tf1 = split(/\t/ , $line);
}

你的@tf1数组中有三列(顺便说一下 - 你的变量命名需要认真工作!)你现在需要做的就是从数组中打印第二和第三个元素(但请记住Perl数组元素从零开始编号。

print "$tf1[1] / $tf1[2]\n";

利用Perl的默认行为,可以大大简化您的代码。

while (<FILE_HANDLE>) {          # Store record in $_
    my @tf1 = split(/\t/);       # Declare and initialise on one line
                                 # split() works on $_ by default
    print "$tf1[1] / $tf1[2]\n";
}

答案 3 :(得分:0)

比@daxim更简洁:作为单线:

perl -aE 'say "@F[1,2]" ' file

另请参阅:How to sort an array or table by column in perl?