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 p> 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) p> 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? P> merci -
Lp p> p>
5 Réponses :
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 } } }
awk
awk '!a[$2]++' FS='[ _]*' exp.txt
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
Peut être raccourci supplémentaire Awk 'Split (2 $, P, "_") &&! a [p [1]] ++ 'exp.txt code>
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.
Perl
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.