Perl Oneliner для анализа нескольких условий в регулярных выражениях - PullRequest
2 голосов
/ 02 марта 2010

У меня есть файл, который содержит строки, которые выглядят так:

>AF001546_1 [88 - 462] 1 MGQQ
>AF001543_1 [88 - 261] ACGT

Не то чтобы каждая строка могла содержать 6 ИЛИ 5 полей. Что я хочу сделать, это захватить Поля 1,2,3 (только номер), 5 (только номер) и последнее поле (строки ACGT или MGOQ).

Итак, ожидаемый результат такой:

>AF001546_1 88 462 MGQQ
>AF001543_1 88 261 ACGT

Теперь я использовал перл однострочник, но это не удалось:

perl -lne 'print "$1 $2 $3 $4" if /(\w+)_\d+\D+(\d+)\D+(\d+)\](\D+)/' 

Как правильно это сделать?

Ответы [ 5 ]

3 голосов
/ 02 марта 2010
perl -lne 'print "$1 $2 $3 $4" if /(>\w+)\D+(\d+)\D+(\d+)\D+\d*\s+(\w+)/'
2 голосов
/ 03 марта 2010

Вы также используете следующий код

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";
}
1 голос
/ 02 марта 2010

попробуйте это perl -lne 'print "$ 1 $ 2 $ 3 $ 4" if / (\ w +) _ \ d + \ D + (\ d +) \ D + (\ d +)] (\ D +) / m'

нужно использовать модификатор / м

1 голос
/ 02 марта 2010

В зависимости от того, насколько гибкий пробел, это довольно читабельно:

print "$1 $2 $3 $4" if /([^_]+)_\d+ \[(\d+) - (\d+)\] (?:\d+ )?(.*)/
1 голос
/ 02 марта 2010
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...