J'ai un fichier csv, et je voudrais le trier par priorité de colonne, comme "Trier par". Par exemple:
3;1;2
1;3;2
1;2;3
2;3;1
2;1;3
3;2;1
Si cette situation était le résultat d'un "select", le "order by" serait le suivant: order by column2, column1, column3 - le résultat serait:
2;1;3
3;1;2
1;2;3
3;2;1
1;3;2
2;3;1
J'aimerais savoir comment obtenir ce même résultat en utilisant la commande "sort" sous Unix.
unix
sorting
csv
sql-order-by
Rafael Orágio
la source
la source
Réponses:
la source
-n
option qui "comparera selon la valeur numérique de la chaîne" ou l'-g
option qui "comparera selon la valeur numérique générale". Une comparaison de chaînes de valeurs numériques obtiendra les nombres classés comme1,10,2,20
. Au moins, ce sont des options disponibles sur ma version de tri sur CentOS. Vous devez vérifier avec la page de manuel les options correctes sur votre version de tri.sort: stray character in field spec: invalid field specification ‘2,1,3’
sort --field-separator=',' -r -k3 -k1 -k2 source.csv > target.csv
fonctionné pour moi.sort --field-separator=';' --key={2,1,3}
. Cela a fonctionné àGNU coreutils 8.4
partir d'avril 2016--key={2,1,3}
utilise l'expansion d'accolades de bashSupposons que vous ayez une autre ligne
3;10;3
dans votreunsorted.csv
fichier. Ensuite, je suppose que vous vous attendez à un résultat trié numériquement:et non triés par ordre alphabétique:
Pour l'obtenir, vous devez utiliser
-n
:Il convient de mentionner qu'il
2,2
faut utiliser. Si seulement2
est utilisé,sort
prend alors la chaîne du début du champ 2 à la fin.2,2
s'assure que seul le champ2
est utilisé.la source
3;10;3
,3:10:5
,3:10;2
,3;10;3
dans cet ordre dans le fichier source, et lors de l' utilisation juste-k 2,2
il semble trier la colonne 2 et 3. La page de manuel dit"The -k option may be specified multiple times, in which case subsequent keys are compared when earlier keys compare equal."
. Dans mon cas, la clé précédente (valeur = 10) était comparable, cependant, je n'ai pas spécifié-k
plusieurs fois. Je ne sais pas s'il s'agit d'un comportement fiable ou lié à mon système (mac). En fin de compte, cela n'a pas d'importance, tant que le tri primaire est correct.-s
un tri stable qui ignore les clés égales, c'est apparemment plus rapide selon l'homme.La réponse de Charlie ci-dessus n'a pas fonctionné pour moi sur Cygwin (tri version 2.0, GNU textutils), ce qui suit a fonctionné:
la source
sort --field-separator=';' -k2 -k1 -k3 test.csv
..et si quelqu'un a suivi la solution de 'tri' mais veut maintenant obtenir plus qu'une seule entrée unique par ligne (c'est-à-dire le nombre X supérieur d'entrées uniques), une fois que vous avez trié le fichier en utilisant 'sort', vous pouvez utiliser une petite application que j'ai créée ici:
https://github.com/danieliversen/MiscStuff/blob/master/scripts/findTopUniques.java
la source
cat unsorted-file | sort | uniq | head -X
- quandX
est le nombre de premières lignes que vous souhaitez afficher.uniq
dans l'ordre des tubes, entre lesort
et lehead
, qui donne une unicité à toutes les lignes triées juste avant l'extraction des premières lignes.