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+ )?(.*)/