J'ai un fichier qui comporte trois colonnes. La colonne 3 contient les noms des gènes et ressemble à ceci:
Rv0729,Rv0993,Rv1408
Rv0162c,Rv0761c,Rv1862,Rv3086
Rv2790c
Comment puis-je imprimer le nombre de gènes dans chaque ligne?
text-processing
Saisha
la source
la source
Rv*
modèle n'importe où sur la ligne et pas seulement dans une colonne particulière. Je vais donc simplement noter que si vous avez réellement d'autres données dans le fichier, non présentées dans la question ici, vous devrez peut-être modifier les solutions en conséquence. (Ou clarifiez la question.)Réponses:
Vous voulez simplement ajouter une colonne avec le nombre de colonnes qu'elle contient. Cela peut être fait en utilisant
awk
:NF
est uneawk
variable contenant le nombre de champs (colonnes) dans l'enregistrement en cours (ligne). Nous imprimons ce numéro suivi d'une virgule et du reste de la ligne, pour chaque ligne.Une alternative (même résultat, mais peut sembler un peu plus propre):
FS
est le séparateur de champs quiawk
utilise pour diviser chaque enregistrement en champs, et nous le définissons sur une virgule-F ','
sur la ligne de commande (comme dans la première solution).OFS
est le séparateur de champ de sortie , et nous le définissons commeFS
avant la lecture de la première ligne d'entrée.la source
Si vous vouliez compter le nombre d'occurrences du
Rv[0-9]{4}c?
modèle par opposition au nombre de champs délimités par des virgules comme le suggère le sujet de votre question, vous pouvez faire:la source
Une approche Perl:
Les
-a
marquesperl
se comportent commeawk
et divisent chaque ligne d'entrée sur la chaîne donnée par-F
et enregistrent les champs résultants dans le tableau@F
. Par conséquent,$#F
sera l'indice de tableau le plus élevé@F
et, puisque les tableaux commencent à compter0
,$#F+1
sera le nombre total d'éléments dans le tableau. Le-p
moyen "imprime chaque ligne d'entrée après avoir appliqué le script donné par-e
. C'ests///
l'opérateur de substitution et ici, nous remplaçons le début de la ligne (^
) par le nombre de champs + 1 et une virgule ($#F+1 . ","
).la source
Votre question indique que la colonne 3 contient les noms des gènes. Je suppose que votre entrée réelle est la suivante:
Chaque nom de gène dans la colonne 3 contient la
Rv
sous-chaîne principale . Ainsi, nous pouvons les compter en python comme suit:La liste résultante montre le nombre de gènes dans chaque ligne, dans leur ordre respectif. Si nous voulons le rendre plus verbeux et inclure la possibilité que les gènes ne contiennent pas de chaîne "Rv" (mais gardons l'hypothèse que la colonne3 est une chaîne de valeur séparée par des virgules), nous pouvons également faire ce qui suit:
Essai:
la source