-1
votes

Existe-t-il une commande Linux pour la soustraction de chaîne entre les colonnes?

Je traite une colonne SNP au format VCF.

Les colonnes d'entrée sont comme suit: p> xxx pré>

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


1 commentaires

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.


3 Réponses :


3
votes

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


1 commentaires

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!



1
votes
$ 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.

1 commentaires

J'ai essayé cette ligne de commande, la sortie est exactement ce dont j'ai besoin, merci!



1
votes

Utilisation de Perl au lieu d'AWK permet une courte doublure one-liner: xxx


1 commentaires

Cher Shawn, je ne sais pas trop de Perl, de toute façon que cette ligne fonctionne bien pour moi .Merci!