Je traite une colonne SNP au format VCF.
Les colonnes d'entrée sont comme suit: p> sortie attendue: p> ref ALT
A G
A T
T C
G T
A G
C G,T
G A
T C
T A,G
3 Réponses :
Ce n'est rien d'élégant ici, itération juste à travers les champs de chaque ligne et décider d'imprimer ou non après la comparaison avec la première colonne.
NR == 1 {print; next} { printf "%s", $1 sep = "\t" for (i = 2; i <= NF; ++i) { if ($i != $1) { printf "%s%s", sep, $i sep = "," } } print "" } $ awk -f a.awk file ref ALT A G A T T C G T A G C G,T G A T C T A,G
Je veux l'utiliser en pipeline, donc j'ai converti le fichier AWK en une ligne: Cat Inputf.File | awk 'nr == 1 {imprimé; Suivant} {printf "% s", 1 $; sep = "\ t"; pour (i = 2; i <= nf; ++ i) {if ($ i! = 1 $ 1) {printf "% S% S", SEP, $ i; sep = ","}} Imprimer ""} '"moins la sortie est exactement ce dont j'ai besoin, merci!
$ awk 'BEGIN{FS=OFS="\t"} NR>1{sub($1," ",$2); gsub(/^ +| +$/,"",$2); gsub(/ +/,",",$2)} 1' file ref ALT A G A T T C G T A G C G,T G A T C T A,G The above will only work when $1 doesn't contain RE metachars and can't be a substring of any of the strings in $2.
J'ai essayé cette ligne de commande, la sortie est exactement ce dont j'ai besoin, merci!
Utilisation de Perl au lieu d'AWK permet une courte doublure one-liner:
Cher Shawn, je ne sais pas trop de Perl, de toute façon que cette ligne fonctionne bien pour moi .Merci!
Pourriez-vous expliquer le besoin logique d'obtenir une sortie attendue de l'entrée donnée? En outre, ne supposez pas que tout le monde saurait savoir ce qui est SNP ou VCF. Si cela est lié à la bioinformatique, bioinformatique.stackexchange.com pourrait vous convient mieux. Et on s'attend à ce que vous montriez ce que vous avez fait pour résoudre ce problème vous-même.