Perl Oneliner pour parsingr plusieurs conditions dans regex

J’ai un fichier qui contient des lignes qui ressemble à ceci:

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

Pas que chaque ligne puisse contenir 6 ou 5 champs. Ce que je veux faire, c’est capturer les champs 1,2,3 (num only), 5 (num only) et le dernier champ (ACGT ou MGOQ).

Donc, le résultat attendu est le suivant:

 >AF001546_1 88 462 MGQQ >AF001543_1 88 261 ACGT 

Maintenant le perl one-liner que j’ai utilisé est ceci, mais a échoué:

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

Quelle est la bonne façon de le faire?

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

Vous utilisez également le code suivant

 use ssortingct; 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"; } 
 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 

essayez cette option -lne ‘print “$ 1 $ 2 $ 3 $ 4” si / (\ w +) _ \ d + \ D + (\ d +) \ D + (\ d +)] (\ D +) / m’

vous devez utiliser le modificateur / m

Selon la flexibilité des espaces, ceci est assez lisible:

 print "$1 $2 $3 $4" if /([^_]+)_\d+ \[(\d+) - (\d+)\] (?:\d+ )?(.*)/