152 votes

Plusieurs clés de tri avec Unix de tri

J'ai potentiellement de gros fichiers qui doivent être triés par 1-n touches. Certaines de ces touches peut être numérique et certains d'entre eux pourraient ne pas l'être. C'est d'une largeur fixe en forme de colonne du fichier si il n'existe pas de délimiteurs.

Est-il un bon moyen de le faire avec Unix sorte? Avec une touche, c'est aussi simple que d'utiliser le "- n". J'ai lu l'homme et de la page de recherche Google brièvement, mais n'a pas trouvé un bon exemple. Comment pourrais-je aller sur la réalisation de cette?

Note: j'ai exclu Perl en raison de la taille du fichier de potentiel. Il serait un dernier recours.

357voto

andras Points 1497

Prenez soin de bien:

Si vous souhaitez trier les fichiers principalement par le champ 3, et secondairement par le champ 2 vous ne voulez pas que cette:

sort -k 3 -k 2 < inputfile

vous souhaitez plutôt ceci:

sort -k 3,3 -k 2,2 < inputfile

Le premier trie les fichiers par la chaîne à partir du début de la zone 3 à la fin de la ligne (qui est potentiellement unique).

-k, --key=POS1[,POS2]     start a key at POS1 (origin 1), end it at POS2
                          (default end of line)

103voto

clintp Points 5127

L'option-k est ce que vous voulez.

-k 1.4,1.5n -k 1.14,1.15n

Serait d'utiliser les positions des caractères 4-5 dans le premier champ (un champ de longueur fixe) et de trier numériquement comme la première clé.

La deuxième clé de caractères 14-15 dans le premier champ.

(edit)

Exemple (tout ce que j'ai le DOS/cygwin à portée de main):

dir | \cygwin\bin\sort.exe -k 1.4,1.5n -k 1.40,1.60r

pour les données:

12/10/2008  01:10 PM         1,564,990 outfile.txt

Trie la liste du répertoire par le numéro du mois (pos 4-5) numériquement, puis par nom de fichier (pos 40-60) dans le sens inverse. Depuis il n'y a pas d'onglets, c'est tout le champ 1 à trier.

73voto

Ken Gentle Points 10162

Utiliser l' -k (ou --key=POS1[,POS2]). Il peut apparaître plusieurs fois et à chaque clé peut avoir des options globales (comme n pour le tri numérique)

25voto

edW Points 27

Voici l'une de trier les différentes colonnes dans un fichier csv, numérique et ordre du dictionnaire, colonnes 5 et après que l'ordre alphabétique

~/test>sort -t, -k1,1n -k2,2n -k3,3d -k4,4n -k5d sort.csv 1,10,b,22,Ga 2,2,b,20,F 2,2,b,22,Ga 2,2,c,19,Ga 2,2,c,19,Gb,hi 2,2,c,19,Gb,hj 2,3,a,9,C

~/test>cat sort.csv 2,3,a,9,C 2,2,b,20,F 2,2,c,19,Gb,hj 2,2,c,19,Gb,hi 2,2,c,19,Ga 2,2,b,22,Ga 1,10,b,22,Ga

Remarque le -k1,1n moyens numériques de départ à la colonne 1 et se terminant à la colonne 1. Si j'avais fait ci-dessous, il aurait concaténées la colonne 1 et 2 qui 1,10 triés 110

~/test>sort -t, -k1,2n -k3,3 -k4,4n -k5d sort.csv 2,2,b,20,F 2,2,b,22,Ga 2,2,c,19,Ga 2,2,c,19,Gb,hi 2,2,c,19,Gb,hj 2,3,a,9,C 1,10,b,22,Ga

12voto

Dong Hoon Points 354

Je crois que dans votre cas, quelque chose comme

sort -t@ -k1.1,1.4 -k1.5,1.7 ... <inputfile

fonctionnera mieux. @ est le séparateur de champ, assurez-vous que c'est un personnage qui n'apparaît nulle part. alors, votre avis est considéré comme consistant en une colonne.

Edit: apparemment clintp déjà donné une réponse similaire, désolé. Comme il le souligne, les drapeaux " n " et " r " peut être ajouté à tous les k.... option.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X