La sélection des lignes uniques basés sur deux colonnes
J'ai essayé de trouver un moyen pour sélectionner des lignes qui sont uniques sur la base des valeurs de deux colonnes. Pour exemple, voici un exemple/exemple de mon fichier:
chr1 10 12
chr1 10 12
chr1 10 11
chr1 9 12
chr2 15 20
Et c'est ce que je veux de mon résultat est:
chr1 10 12
chr1 10 11
chr1 9 12
chr2 15 20
J'ai essayé d'utiliser ce code, car j'aime la façon dont il ne plaisante pas avec la commande de mon fichier:
awk -F"\t" '!_[$2]++' SNP_positions.txt > SNP_positions_uniq.txt
Cependant, il capture seulement les caractéristiques uniques d'une colonne. Est-il un moyen de le modifier pour le faire fonctionner pour les deux colonnes?
- vous parler de deux colonnes, mais il y a trois dans votre fichier. Ceux qui devraient être pris en considération? Donner un exemple générique si possible. Votre approche fonctionne pour la donnée de fichier, de sorte qu'il peut être autre chose.
- Je veux trouver des lignes qui sont des valeurs uniques dans les deux colonnes deux et trois. Si j'ai utilisé le code au-dessus de ma sortie ne serait pas me donner la 3e ligne de ma sortie (chr1 122332 130204). Je vais modifier pour le rendre plus simple
- Celui qui dit d'utiliser le
_
comme un nom de variable est un idiot, ne pas écouter les autres. Nous savons tous qu'une seule lettre, les noms de variables sont à éviter, en général, comme ils ne font rien pour améliorer la clarté de votre code, mais à l'aide de quelque chose qui n'est même pas une lettre est juste ridicule. - comment faire pour exécuter cette requête mysql. j'ai le même problème
Vous devez vous connecter pour publier un commentaire.
Vous pouvez parfaitement utiliser un index qui utilise plus d'un champ pour les éléments du tableau:
Dans ce cas, nous utilisons
$2, $3
comme index. De cette façon, nous aurons tous les différents éléments de la n-uplets($2, $3)
.awk -F"\t" '!uniq[$1 FS $3]++' file
ouawk -F"\t" '!uniq[$1 FS $2 FS $3]++' file'
uniq[$0]
. Si vous voulez trois de plus,uniq[$1 FS $2 FS $3]
. Notez que nous utilisonsFS
pour éviter2\tab3
correspondre à une ligne2 3
.,
dans un tableau d'index n'est pas la même chose qu'un,
dans une instruction print. L'ancien obtient la valeur deSUBSEP
(un contrôle char par défaut), alors que ce dernier obtient la valeur deOFS
(un espace par défaut).La
awk
solution fournie est grand et rapide, mais je suis venu ici moi-même à la recherche pour lesort
solution, qui est probablement plus lent dans presque tous les cas:J'ai trouvé la réponse ici:
https://stackoverflow.com/a/12546627/778533