J'essaie d'extraire l'ID de séquence et le numéro de cluster qui se produisent sur différentes lignes dans le même fichier texte.
L'entrée ressemble à
>Cluster 72
0 319aa, >O311_01007... *
>Cluster 73
0 318aa, >1494_00753... *
1 318aa, >1621_00002... at 99.69%
2 318aa, >1622_00575... at 99.37%
3 318aa, >1633_00422... at 99.37%
4 318aa, >O136_00307... at 99.69%
>Cluster 74
0 318aa, >O139_01028... *
1 318aa, >O142_00961... at 99.69%
>Cluster 75
0 318aa, >O300_00856... *
La sortie souhaitée est l'ID de séquence dans une colonne et le numéro de cluster correspondant dans la seconde.
>O311_01007 72
>1494_00753 73
>1621_00002 73
>1622_00575 73
>1633_00422 73
>O136_00307 73
>O139_01028 74
>O142_00961 74
>O300_00856 75
Quelqu'un peut-il m'aider?
>
? En outre, vous pourriez être intéressé par notre site partenaire , Bioinformatics .Réponses:
Avec awk:
-F '[. ]*'
>Cluster
lignes), enregistrez le deuxième champ comme ID et passez à la ligne suivantela source
$1 == ">Cluster"
lieu deNF == 2
, en fonction de ce qui pourrait se trouver dans le fichier.Vous pouvez utiliser
awk
pour cela:La première instruction de bloc capture l'ID de cluster. La deuxième instruction de bloc (par défaut) extrait les données souhaitées et les imprime.
la source
" "
comme argumentprint
. Utilisez simplement une virgule pour séparer les arguments et il utilisera l'OFS, espace par défaut, pour séparer les arguments.Voici une alternative avec Ruby comme doublure:
ou étalé sur plusieurs lignes:
Je suppose que c'est seulement plus lisible que la
awk
version si vous connaissez Ruby et regexen. En prime, ce code pourrait être un peu plus robuste que le simple fractionnement des lignes, car il recherche le texte environnant.la source
Perl:
Explication
perl -ne
: lire le fichier d'entrée ligne par ligne (-n
) et appliquer le script donné par-e
à chaque ligne.if(/^>.*?(\d+)/){$n=$1;}
: si cette ligne commence par un>
, recherchez la plus longue séquence de nombres à la fin de la ligne et enregistrez-la sous$n
.else{ s/.*(>[^.]+).*/$1 $n/; print
: si la ligne ne commence pas par>
, remplacez tout par le plus long tronçon de non-.
caractères suivant un>
(>[^.]+
), c'est-à-dire le nom de la séquence ($1
car nous avons capturé la correspondance d'expression régulière) et la valeur actuelle de$n
.Ou, pour une approche plus maladroite:
C'est juste une façon un peu plus lourde de faire la même idée de base que les différentes
awk
approches. Je l'inclus pour la fin et pour les fans de Perl. Si vous avez besoin d'une explication, utilisez simplement les solutions awk :).la source