-2
votes

Seulement conserver des lignes avec une première instance de motif, pour plusieurs modèles

J'ai un fichier ici avec de nombreuses lignes et un certain nombre de colonnes, et je voudrais garder des lignes uniquement qui ont la première occurrence d'un motif / une chaîne, mais pour toute chaîne / motif répétée dans cette colonne.

par exemple xxx

et je voudrais supprimer des lignes qui ont le même identifiant de départ (dans la colonne ID), jusqu'à la "_" caractère ... < / p>

par exemple (après exécution de script) xxx

Je ne sais pas comment aborder en raison du fait que je veux supprimer des lignes avec la ou les occurrences ultérieures de tout modèle (en hausse au caractère _) dans la colonne ID, pas seulement un modèle particulier. Est-ce même possible?

merci - Lp


1 commentaires

Vous obtiendrez une réception beaucoup plus amicale et une meilleure meilleure aide ici si vous montrez quel code vous avez essayé jusqu'à présent et décrivez quels problèmes vous aviez avec elle. Sans code, votre question ressemble à une demande de consultation gratuite et de nombreuses personnes n'aiment pas cela.


5 Réponses :


0
votes

Utilisez un tableau associatif pour contenir des clés qui ont déjà été observées:

{
    if (split($2, a, /_/) > 0 )
    {
        key = a[1]
        if (!value[key])
        {
            value[key] = 1
            print $0
        }
    }
}


0 commentaires

0
votes

awk xxx


0 commentaires

1
votes
awk '!a[$2]++' FS='[ _]*' exp.txt

0 commentaires

0
votes

Si _ code> n'est pas utilisé dans le premier champ La réponse de William Pursell est la meilleure, sinon, même concept appliqué après avoir fractionné le deuxième champ. Notez que s'il n'y a pas de _ code> dans le champ, toute la valeur sera utilisée.

$ awk '{split($2,p,"_")} !a[p[1]]++' file

POS     ID      REF     ALT     QUAL    FILTER 
182     3_12    G       A       .       PASS
199     4_22    G       A       .       PASS
201     10_22    A      A       .       PASS


2 commentaires

Peut être raccourci supplémentaire Awk 'Split (2 $, P, "_") &&! a [p [1]] ++ 'exp.txt


Ma solution est le gagnant du code de code, mais je ne suis pas sûr que ce soit "meilleur". Un peu trop obscur, vraiment.



0
votes

Perl xxx


0 commentaires