我的文件包含如下所示的行:
>AF001546_1 [88 - 462] 1 MGQQ
>AF001543_1 [88 - 261] ACGT
并非每行都包含6个OR 5字段。我想要做的就是捕获 字段1,2,3(仅限num),5(仅限num)和最后一个字段(ACGT或MGOQ字符串)。
所以预期的输出是这样的:
>AF001546_1 88 462 MGQQ
>AF001543_1 88 261 ACGT
现在我使用的perl单行是这个,但失败了:
perl -lne 'print "$1 $2 $3 $4" if /(\w+)_\d+\D+(\d+)\D+(\d+)\](\D+)/'
这样做的正确方法是什么?
答案 0 :(得分:3)
perl -lne 'print "$1 $2 $3 $4" if /(>\w+)\D+(\d+)\D+(\d+)\D+\d*\s+(\w+)/'
答案 1 :(得分:2)
您还使用以下代码
use strict;
use warnings;
my $str=">AF001546_1 [88 - 462] 1 MGQQ";
if($str=~/(\w+)\s\D([0-9]{2}) - ([0-9]{3})\D\s\d\s(.*)/)
{
print "$1 $2 $3 $4\n";
}
答案 2 :(得分:1)
while(<>){
chomp;
s/\[|\]//g;
if ($_ =~ /^>/){
@s = split /\s+/;
print "$s[0] $s[1] $s[3]\n";
}
}
$ perl -F"\s+" -lane '$F[3]=~s/\]//;$F[1]=~s/\[//;print "$F[0] $F[1] $F[3]";' file
>AF001546_1 88 462
>AF001543_1 88 261
答案 3 :(得分:1)
试试这个 perl -lne'print'$ 1 $ 2 $ 3 $ 4“if /(\ w +)_ \ d + \ D +(\ d +)\ D +(\ d +)](\ D +)/ m'
你需要使用修饰符/ m
答案 4 :(得分:1)
根据空白的灵活性,这是相当可读的:
print "$1 $2 $3 $4" if /([^_]+)_\d+ \[(\d+) - (\d+)\] (?:\d+ )?(.*)/