J'ai des fichiers potentiellement volumineux qui doivent être triés par clés 1-n. Certaines de ces touches peuvent être numériques et d'autres non. Il s'agit d'un fichier en colonnes de largeur fixe, il n'y a donc pas de délimiteurs.
Y a-t-il un bon moyen de faire cela avec le tri Unix? Avec une touche, c'est aussi simple que d'utiliser «-n». J'ai lu la page de manuel et cherché brièvement sur Google, mais je n'ai pas trouvé un bon exemple. Comment pourrais-je y parvenir?
Remarque: j'ai exclu Perl en raison de la taille potentielle du fichier. Ce serait un dernier recours.
Réponses:
Utilisez l'
-k
option (ou--key=POS1[,POS2]
). Il peut apparaître plusieurs fois et chaque clé peut avoir des options globales (commen
pour le tri numérique)la source
Attention cependant:
Si vous souhaitez trier le fichier principalement par le champ 3, et secondairement par le champ 2, vous voulez ceci:
Not this:
sort -k 3 -k 2 < inputfile
qui trie le fichier par la chaîne du début du champ 3 à la fin de la ligne (qui est potentiellement unique).la source
sort -k 3,3nr -k 2,2
-k2
devrait être-k2,2
et une virgule de fin-k2,
devrait être «fin de ligne par défaut magique ou autre».L'option -k est ce que vous voulez.
Utiliserait les positions de caractère 4-5 dans le premier champ (c'est tout un champ pour une largeur fixe) et trierait numériquement comme première clé.
La deuxième clé serait également les caractères 14-15 dans le premier champ.
(Éditer)
Exemple (tout ce que j'ai, c'est DOS / cygwin à portée de main):
pour les données:
Trie la liste du répertoire par numéro de mois (pos 4-5) numériquement, puis par nom de fichier (pos 40-60) à l'envers. Puisqu'il n'y a pas d'onglets, c'est tout le champ 1 à trier.
la source
En voici une pour trier les différentes colonnes d'un fichier csv par ordre numérique et dictionnaire, colonnes 5 et suivantes comme ordre dictionnaire
Notez que -k1,1n signifie numérique commençant à la colonne 1 et se terminant à la colonne 1. Si je l'avais fait ci-dessous, il aurait concaténé les colonnes 1 et 2, ce qui ferait 1,10 trié comme 110
la source
Je crois dans ton cas quelque chose comme
fonctionnera mieux. @ est le séparateur de champ, assurez-vous qu'il s'agit d'un caractère qui n'apparaît nulle part. alors votre entrée est considérée comme constituée d'une colonne.
Edit: apparemment, clintp a déjà donné une réponse similaire, désolé. Comme il le fait remarquer, les drapeaux «n» et «r» peuvent être ajoutés à chaque option -k ....
la source
Notez qu'il peut également être souhaitable de stabiliser le tri avec le
-s
commutateur, de sorte que les lignes de rang égal conservent également leur ordre relatif d'origine dans la sortie.la source
Je veux juste ajouter quelques conseils, lorsque vous utilisez le tri, faites attention à vos paramètres régionaux qui affectent l'ordre de la comparaison clé. J'utilise généralement explicitement LC_ALL = C pour faire de la locale ce que je veux.
la source