J'utilise le tri Unix pour trier un fichier délimité par des virgules avec plusieurs colonnes. Jusqu'à présent, cela a parfaitement fonctionné pour trier les données soit numériquement soit par ordre alphabétique:
Exemple de fichier avant tout tri:
C,United States,WA,Tacoma,f,1
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,Canada,QC,Montreal,f,2
A,Bahamas,Bahamas,Nassau,f,2
A,United States,NY,New York,f,1
Triez le fichier: $ sort -t ',' -k 2,2 -k 3,3 -k 4,4 -k 5,5r -k 6,6nr tmp.csv
Résultat trié:
A,Bahamas,Bahamas,Nassau,f,2
A,Canada,QC,Montreal,f,2
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,United States,NY,New York,f,1
C,United States,WA,Tacoma,f,1
Voici le problème: je veux trier la colonne 2 en fonction d'un tri personnalisé, ce qui signifie que je veux d'abord les États-Unis, puis le Canada, puis les Bahamas:
Tri souhaité:
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,United States,NY,New York,f,1
C,United States,WA,Tacoma,f,1
A,Canada,QC,Montreal,f,2
A,Bahamas,Bahamas,Nassau,f,2
Existe-t-il un moyen de passer le tri Unix un ordre de tri personnalisé qu'il peut ensuite appliquer? Quelque chose comme:
$ sort -t ',' -k 2,2:'United States, Canada, Bahamas' -k 3,3 -k 4,4 -k 5,5r -k 6,6nr tmp.csv
Merci!
join
commande, mais vous pourriez vous retrouver avec beaucoup de tri - les fichiers d'entrée pourjoin
doivent être triés dans un ordre, puis vous utiliseriez àsort
nouveau pour mettre les données dans un ordre différent (et la perte de la colonne d'ordre de tri en tant qu'étape de post-tri).t
au lieu def
dans la dernière ligne?Réponses:
L'autre réponse et commentaire répondent à la question en général, voici à quoi peut ressembler une implémentation:
la source
sed
n'était pas vraiment nécessaire ici.Vous ne pouvez pas faire ça avec le tri . À ce stade, vous devriez vraiment atteindre awk / perl / votre-langue-de-choix . Vous pouvez le truquer, cependant. Vous pouvez, par exemple, utiliser sed pour remplacer «États-Unis» par 0, «Canada» par 1 et «Bahamas» par 2, puis effectuer un tri numérique par rapport à cette colonne, puis la redéfinir. Ou changez «États-Unis» en «États-Unis, 0», etc., triez dans la colonne supplémentaire, puis jetez-la.
la source
Je viens d'écrire un assistant appelé csort pour vous faciliter la tâche. Il préfixe chaque ligne avec une valeur de votre choix en fonction de la sous-chaîne ou des correspondances d'expressions régulières dans la ligne:
La
2=STR
notation signifie "correspond si le deuxième champ est égalSTR
".Vous pouvez ensuite éventuellement canaliser la sortie
cut -c3-
pour supprimer le préfixe.la source