Pourquoi le type linux ne me donne pas les résultats souhaités?
Question
J'ai un fichier a.csv avec un contenu similaire à ci-dessous
a,b,c
a ,aa, a
a b, c, f
a , b, c
a b a b a,a,a
a,a,a
a aa ,a , t
J'essaie de le trier en utilisant sort -k1 -t, a.csv
Mais cela donne les résultats suivants
a,a,a
a ,aa, a
a aa ,a , t
a b a b a,a,a
a , b, c
a,b,c
a b, c, f
Ce qui n’est pas le tri réel dans la 1ère colonne. Qu'est-ce que je fais mal?
La solution
Vous devez également spécifier la position finale sur 1:
sort -k1,1 -t, a.csv
Autres conseils
Essayez ceci: sort -t, -k1,1 a.csv
L'homme suggère qu'en omettant le champ de fin, il trie tous les caractères commençant au champ n
jusqu'à la fin de la ligne:
-k POS1[,POS2]'
The recommended, POSIX, option for specifying a sort field. The
field consists of the part of the line between POS1 and POS2 (or
the end of the line, if POS2 is omitted), _inclusive_. Fields and
character positions are numbered starting with 1. So to sort on
the second field, you'd use `-k 2,2' See below for more examples.
Essayez plutôt ceci:
sort -k 1,1 -t , a.csv
sort lit -k 1
comme suit: "trier à partir du premier champ" - défiant ainsi efficacement le point de passer l'argument en premier lieu.
Ceci est documenté dans la page de manuel de tri et mis en garde dans la section Exemples: <
Triez numériquement le deuxième champ et résoudre les liens en triant alphabétiquement sur les troisième et quatrième caractères du champ cinq. Utilisez `: 'comme le délimiteur de champ:
$ sort -t: -k 2,2n -k 5.3,5.4
Notez que si vous aviez écrit
-k 2
-k 2,2
,trier
aurait utilisé tous les personnages commençant à la seconde champ et s'étendant jusqu'à la fin de la ligne en tant que clé numérique principale. Pour la grande majorité des applications, traiter des clés couvrant plus d'un champ comme numérique ne fera pas ce que vous attendre.