Perl中的拆分数组从新行到制表符分隔

时间:2016-09-14 13:25:19

标签: perl

我有以下格式的数据:

4.8e-38  140.9   4.3    5.8e-38  140.6   4.3    1.1  1  NP_001275340.1  ELF4-like protein [Solanum tuberosum]XP_0063
4.8e-38  140.9   4.3    5.8e-38  140.6   4.3    1.1  1  XP_015080718.1  PREDICTED: protein ELF4-LIKE 3-like isoform X
5.3e-38  140.7   4.4    6.3e-38  140.5   4.4    1.1  1  XP_016481343.1  PREDICTED: protein ELF4-LIKE 4-like [Nicotian
5.4e-38  140.7   5.1    6.6e-38  140.4   5.1    1.1  1  XP_009784404.1  PREDICTED: protein ELF4-LIKE 4-like [Nicotian

我创建了一个Perl数组,其中元素存储在新行中。例如,如果我打印$ARRAY[0],则输出为:

4.8e-38  140.9   4.3    5.8e-38  140.6   4.3    1.1  1  NP_001275340.1  ELF4-like protein [Solanum tuberosum]XP_0063.

我需要的是在列中拆分数组,这样如果我print "$ARRAY[8]",输出应该是标识符/加入号列表(NP_001275340.1, XP_015080718.1)。

我尝试过使用分割功能,但由于数据没有统一分开(例如,通过制表符或空格),我无法做到这一点。有什么建议吗?

1 个答案:

答案 0 :(得分:3)

如果它没有统一分开,那么有用的是:

split默认为“任何空格”

所以你可以这样做:

#!/usr/bin/env perl

use strict;
use warnings;

while ( <DATA> ) {
    my @array = split;
    print $array[8],"\n";
}

__DATA__
4.8e-38  140.9   4.3    5.8e-38  140.6   4.3    1.1  1  NP_001275340.1  ELF4-like protein [Solanum tuberosum]XP_0063
4.8e-38  140.9   4.3    5.8e-38  140.6   4.3    1.1  1  XP_015080718.1  PREDICTED: protein ELF4-LIKE 3-like isoform X
5.3e-38  140.7   4.4    6.3e-38  140.5   4.4    1.1  1  XP_016481343.1  PREDICTED: protein ELF4-LIKE 4-like [Nicotian
5.4e-38  140.7   5.1    6.6e-38  140.4   5.1    1.1  1  XP_009784404.1  PREDICTED: protein ELF4-LIKE 4-like [Nicotian

split也允许您指定regex

my @array = split /(?:\t| +)/; 

哪个允许您在选项卡上拆分一个或多个空格,但不会被空白字段的双标签捕获。注意 - 您需要?:,因为split ...将捕获,并将其添加到它返回的列表中。

它还允许您指定字段限制 - 因为您的“上一个”字段看起来像是一个描述:

my @array = split ' ', $_, 10;

这对$array[8]的作用相同,但$array[9]将包含:“预测:蛋白质ELF4-like 3-like isoform X”

问题的真正根源在于,如果你已经将所有文件读入数组 - 你所拥有的是一系列行。

您可以在输入时(如上例所示)或通过map对此进行转换:

#!/usr/bin/env perl

use strict;
use warnings;
use Data::Dumper;

my @input = <DATA>;
print Dumper \@input;
print join "\n", map { (split)[8] } @input;

__DATA__
4.8e-38  140.9   4.3    5.8e-38  140.6   4.3    1.1  1  NP_001275340.1  ELF4-like protein [Solanum tuberosum]XP_0063
4.8e-38  140.9   4.3    5.8e-38  140.6   4.3    1.1  1  XP_015080718.1  PREDICTED: protein ELF4-LIKE 3-like isoform X
5.3e-38  140.7   4.4    6.3e-38  140.5   4.4    1.1  1  XP_016481343.1  PREDICTED: protein ELF4-LIKE 4-like [Nicotian
5.4e-38  140.7   5.1    6.6e-38  140.4   5.1    1.1  1  XP_009784404.1  PREDICTED: protein ELF4-LIKE 4-like [Nicotian

在上面的示例中,map迭代@input的每个元素,进行拆分,并选择字段8 - 并将其作为列表返回。

所以你可以:

my @identifiers = map { (split)[8] } @input; 

注意 - split仍然有效,例如默认将当前元素拆分为空格。