2011-06-10 5 views
7

He tous, J'ai un fichier ayant quelques colonnes. Je voudrais faire un tri pour la colonne 2, puis appliquer uniq pour la colonne 1. J'ai trouvé ce post parler de tri et uniq pour la même colonne, mais mon problème est un peu différent. Je pense à utiliser quelque chose en utilisant sort et uniq mais je ne sais pas comment. Merci.comment trier basé sur une colonne mais uniq basé sur une autre colonne?

Répondre

7

Vous pouvez utiliser un tuyau, mais il n'est pas en place.

Exemple:

$ cat initial.txt 
1,3,4 
2,3,1 
1,2,3 
2,3,4 
1,4,1 
3,1,3 
4,2,4 

$ cat initial.txt | sort -u -t, -k1,1 | sort -t, -k2,2 
3,1,3 
4,2,4 
1,3,4 
2,3,1 

Résultat est trié par clé 2, unique par clé 1. Notez que le résultat est affiché sur la console, si vous le voulez dans un fichier, il suffit d'utiliser une redirection (> newFiletxt)

autre solution pour ce genre d'opération plus complexe est de compter sur un autre outil (en fonction de vos préférences (et âge), awk, perl ou python)

EDIT: Si je comprends bien la nouvelle exigence, il est trié par Colum 2, colonne 1 est unique pour une colonne donnée 2:

$ cat initial.txt | sort -u -t, -k1,2 | sort -t, -k2,2 
3,1,3 
1,2,3 
4,2,4 
1,3,4 
2,3,1 
1,4,1 

Est-ce que vous attendez? Sinon, je ne comprenais pas :-)

+2

Merci Bruce pour votre réponse. hmhm .... mais mon cas devra avoir trier d'abord puis uniq.Cela signifie que la première colonne peut avoir des valeurs en double, mais pas l'une à côté de l'autre. Plus d'idée? Je suis un débutant pour awk mais si vous avez une bonne solution pour cela. Je voudrais l'utiliser. Merci. – Ken

+0

Pourriez-vous fournir un échantillon de données et le résultat attendu, par ex. sur http://pastebin.com? Je ne suis pas sûr de comprendre complètement – Bruce

+0

Cool ... celui-ci fonctionne pour moi .. bien qu'il ne soit pas assez robuste pour une colonne non-consécutive. Ça va faire pour ma tâche actuelle. Merci tas. – Ken

0

uniq a besoin que les données soient en ordre de tri pour travailler, donc si vous sort sur le deuxième champ, puis appliquer uniq sur le premier champ, vous ne serez pas obtenir le résultat correct.

Vous voudrez peut-être essayer

sort -u -t, -k1,1 filename | sort -t, -k2,2 
+1

Merci Lobo .. mais je dois trier d'abord puis trouver les uniques dans la première colonne où il peut y avoir des valeurs en double dans la colonne 1 mais elles ne seront pas à côté de chaque autre. Je suis surpris que la commande uniq sous Linux n'ait pas de paramètre pour spécifier une colonne spécifique. Merci. – Ken

+0

La commande 'uniq' vous donne l'option de choisir les champs. consultez les options '-f',' s' et autres. Êtes-vous à la recherche 'sort -t '' -k2,2 b | uniq -f1'? Pourriez-vous fournir un exemple d'entrée et de sortie que vous recherchez? – Lobo

+0

mais les '-f' et' -s' passeront le PREMIER nombre de colonnes/caractères pour la comparaison d'unicité. Ils n'autorisent pas de colonnes spécifiques. La deuxième réponse de Bruce fonctionne pour ma tâche actuelle maintenant. Merci. – Ken

0

Juste pour être sûr que je suis ce que vous voulez dire correctement. Vous souhaitez trier un fichier en fonction de la deuxième colonne du fichier. Ensuite, vous voulez supprimer les doublons de la première colonne (une autre façon de dire en appliquant uniq à la première colonne!). cool, pour ce faire, vous devez effectuer trois tâches:

  1. trier la colonne sur laquelle uniq va être appliquée (puisque uniq peut travail que sur l'entrée triée).
  2. appliquer uniq sur la colonne triée.
  3. Triez la sortie en fonction des valeurs de la deuxième colonne.

En utilisant les tuyaux: La commande est

sort -t ',' -k1 fileName| awk '!x[$1]++' | sort -t ',' -k2 

Notez que vous ne pouvez pas spécifier le premier champ uniq, vous pouvez utiliser le commutateur -f pour sauter les premiers n champs. Par conséquent, j'ai utilisé awk pour remplacer uniq.

+0

Pouvez-vous expliquer cette commande awk? –

0

J'ai utilisé cette sort -t ',' -nk2

trie ici

1,2 
2,5 
3,1 

to 

3,1 
1,2 
2,5 
Questions connexes