J'essaie de filtrer certaines lignes dans un fichier VCF, voici un exemple de lignes: dise que je veux extraire des lignes avec amr_af code> plus grand que 0.5, mais ne pouvait pas comprendre comment utiliser des expressions régulières AWK pour effectuer un tel travail. Essayé
vcftools code>, mais cela n'a pas fonctionné. P> p>
3 Réponses :
Pourriez-vous s'il vous plaît essayer suivi. correspondant code> de
awk code> pour correspondre Regex
amr_af = chiffres.digits code> ou
amr_af = chiffre code> et chaque fois que cette regex obtient des correspondances en ligne, il définit
rstart code> et
rlthongueur code> variables.
&& code> (et condition) Pour vérifier si la valeur Sous-chaîne de
RSTART + 7 CODE> TO jusqu'à
Rlength-7 code> La valeur est supérieure à 0,5 puis imprimez que ligne. p> p>
Vous pouvez diviser la ligne sur le champ que vous avez choisi et examiner si la valeur numérique de l'élément juste après la scission est supérieure à celle de votre seuil.
Plus de détails, diviser l'entrée Ainsi, p> devrait faire ce que vous voulez. Nous divisons la ligne en le si vous voulez paramétrer Ceci, peut-être essayer p> rappel que AWK traite le script pour chaque ligne d'entrée de haut en bas, où chaque instruction de script a la forme p> [< em> condition em>] [ Comme les crochets indiquent, les deux parties sont Facultatif - si condition em> est manquant, l'action em> est prise inconditionnellement; Si action em> est manquant, il est par défaut à gnu awk peut diviser sur un séparateur de champ multi-caractères , afin que vous puissiez utiliser oui, foo = = 2, bar = 0,23, baz = 1 code> sur
, bar = code> donnera une matrice contenant
oui, foo = 2 code> et
0,23, baz = 1 code>. Dans Awk, si vous comparez le deuxième élément à
0.2 code>, il sera simplement convertit autant que possible du début de la valeur en un numéro, puis effectuer une comparaison numérique. P>
x code> et examinons la valeur numérique de
x [2] code>. P>
[\ t;] code> > dans la regex permet un onglet ou un point-virgule avant le nom du champ; Pour être parfaitement général, vous devriez peut-être même utiliser
(^ | [\ t;]) code> pour permettre également le match de se produire au début de la ligne. p>
{ code> action em>
} code>] p>
{imprimé $ 0} code>. Donc, notre script va d'abord diviser inconditionnellement la ligne, puis l'imprimer de manière conditionnelle si
x [2] code> est plus grand que le seuil. P>
-f '[\ t;] amr_af =' code> aussi. p>
Merci beaucoup pour votre réponse rapide! Juste une question rapide: que si je veux extraire la valeur entre amr_af = code> et
; afr_af code> et imprimer la valeur numérique, en utilisant une expression régulière?
Cela devrait être facile à comprendre; Split code> deux fois. Vous pouvez également utiliser la liste code> Match () CODE> de la réponse de Ravindersingh13 et calculez les compensations à partir de
RSTART code> et
rlength code> pour déterminer les indices pour extraire la sous-chaîne mais Je trouve ça plutôt encombrant.
en utilisant bcftools em>: Voir pour plus d'options de Manuels de BCFTools . P> p>
Bienvenue pour, bien que vous ayez laissez-nous savoir que vous avez essayé peu de choses, veuillez également ajouter ces efforts dans votre question.
Aussi s'il vous plaît être clair que l'occurrence de la chaîne que vous souhaitez vérifier? Comme il n'est pas clair de votre question.
Le tag VCF est pour un format de fichier de calendrier; C'est sûrement autre chose?
Essayez
awk '{divisé (0 $, x, / [\ t;] amr_af = /)} x [2]> 0.5' File.vcf code>
Il n'y a pas de lignes où
amr_af code> est supérieur à 0,5 dans votre exemple.
@tripleee, true, je l'ai testé avec un exemple modifié pour la solution car aucune ligne n'est satisfaisante dans les exemples de OP.
@triplee merci! Cette ligne de code fonctionne bien, pourriez-vous s'il vous plaît expliquer brièvement comment cela fonctionne? VCF est le format qui affiche des informations de mutation dans la bioinformatique. Amr_af> 0.5 est juste une chose aléatoire sur ma tête, et oui il n'y a pas d'amr_af> 0,5 dans mes lignes d'exemple. Mes excuses!
Vcftools est remplacé par BCFTools, pour presque tous les problèmes liés à la VCF. C'est l'outil à utiliser, voir ma réponse.