提取竖线分隔记录的第二个字段



>我正在使用perl。

下面是 $match_name 的字符串:

|1015809840|ref|NG_009004.2|
|1015809841|ref|NG_009005.2|

我希望输出为:

1015809840
1015809841

我尝试:

$match_name =~ s/(.*?|.*?)|.*//g;

它会删除所有字符。

my ($second_field) = $row =~ /^ [^|]* | ( [^|]* ) |/x;

my $second_field = ( split(/|/, $row) )[1];

不过,最好使用Text::CSV_XS。

看起来您有固定宽度的数据。您当然可以使用正则表达式来处理固定宽度的数据,但我更喜欢packunpack

use strict;
use warnings 'all';
use 5.010;
while (<DATA>) {
    my @fields = unpack 'x A10 x A3 x A11';
    say $fields[0];
}
__DATA__
|1015809840|ref|NG_009004.2|
|1015809841|ref|NG_009005.2|

输出:

1015809840
1015809841

unpack模板x A10 x A3 x A11意味着:

  • x:跳过字符
  • A10:在第一个字段中读取 10 个字符
  • x:跳过一个字符
  • A3:在第二个字段中读取 3 个字符
  • x:跳过一个字符
  • A11 : 在第三个字段中读出 11 个字符

Perlpacktut 很好地介绍了如何使用固定宽度数据的packunpack

相关内容

  • 没有找到相关文章

最新更新