J'ai vu beaucoup de messages sur le tri d'un fichier basé sur une colonne mais ne m'a pas aidé.
Je veux trier un fichier CSV basé sur la colonne 2 uniquement.
par exemple: Les données de mon fichier ressemblent à celles ci-dessous
H1,H2,H3,H4 C13,R_E,S_F_E,22-OCT-2019 C14,R_E,S_F_E,22-OCT-2019 C13,R_E,S_F_E_RA,22-OCT-2019 C14,R_E,S_F_E_RA,22-OCT-2019 C13,R_E,S_F_E_RB,22-OCT-2019 C14,R_E,S_F_E_RB,22-OCT-2019 C11,R_G,S_F_G,22-OCT-2019 C12,R_G,S_F_G,22-OCT-2019
Ordre de tri attendu de la colonne 2 comme ci-dessous
awk 'NR==1; NR > 1 {print $0 | "sort -t, -k2"}' inputfile >> outputfile
3 Réponses :
Utilisation de Miller ( https://github.com/johnkerl/miller ) et exécution
H1,H2,H3,H4 C13,R_E,S_F_E,22-OCT-2019 C13,R_E,S_F_E_RA,22-OCT-2019 C13,R_E,S_F_E_RB,22-OCT-2019 C14,R_E,S_F_E,22-OCT-2019 C14,R_E,S_F_E_RA,22-OCT-2019 C14,R_E,S_F_E_RB,22-OCT-2019 C11,R_G,S_F_G,22-OCT-2019 C12,R_G,S_F_G,22-OCT-2019
vous aurez
mlr --csv sort -f H2 input.csv
"mlr" n'est pas reconnu. il semble que je dois installer / configurer le projet Miller. Si oui, je dois passer par beaucoup de processus d'approbation @aborruso. Pouvez-vous s'il vous plaît me faire savoir que la même chose peut être réalisée avec awk / une autre commande régulière. Merci pour votre temps.
@Raj Miller est awk, sed, cut, join et sort pour les données indexées par nom telles que CSV, TSV et JSON tabulaire. L'installer est très simple johnkerl.org/miller/doc/build.html#Prebuilt_executables a>
Pourquoi ne pas simplement utiliser head
, tail
et sort
, par exemple
$ head -n1 file; tail -n+2 file | sort -t, -k2 H1,H2,H3,H4 C13,R_E,S_F_E,22-OCT-2019 C14,R_E,S_F_E,22-OCT-2019 C13,R_E,S_F_E_RA,22-OCT-2019 C14,R_E,S_F_E_RA,22-OCT-2019 C13,R_E,S_F_E_RB,22-OCT-2019 C14,R_E,S_F_E_RB,22-OCT-2019 C11,R_G,S_F_G,22-OCT-2019 C12,R_G,S_F_G,22-OCT-2019
Où l'utilisation de head -n1 file
renvoie simplement l'en-tête, puis les lignes restantes obtenues avec tail -n + 2 file
sont redirigées vers sort -t, -k2 code > pour trier le résultat étant le fichier trié complet avec en-tête.
Pour créer un nouveau fichier contenant les résultats triés, exécutez la ligne de commande dans un sous-shell et redirigez la sortie vers un nouveau fichier, par exemple p>
(head -n1 file; tail -n+2 file | sort -t, -k2) > sortedfile
(vous pouvez ensuite utiliser les 2 étapes de rm file; mv sortedfile file
pour remplacer l'original par le fichier trié si vous le souhaitez) p>
Exemple d'utilisation / de sortie
head -n1 file; tail -n+2 file | sort -t, -k2
Merci pour votre temps @David Rankin. Je m'attends à trier uniquement en fonction de la colonne 2. Si 2 lignes de la colonne 2 sont identiques, elles doivent être dans l'ordre d'apparition dans le fichier d'entrée. Si vous observez les résultats que vous avez publiés, lorsque la colonne 2 est la même, elle est triée en fonction de la colonne 1/3. mais je veux que ce soit le même ordre que le fichier d'entrée. Veuillez observer les résultats attendus que j'ai mentionnés dans la question.
J'entends ce que vous dites. Cela peut prendre un tri manuel car même avec le awk
sort
ou le sort
avec shell, il y a très peu de contrôle sur l'algorithme utilisé. Vous auriez presque besoin d'un tri à bulles ou d'insertion. J'aurai le temps dans une heure ou deux pour l'examiner plus avant.
Essayez ceci: -
sort --field-separator=',' --key=2 filename
--field-separator = ',' => le séparateur de champ est ","
--key = 2 ou -k 2: trier une donnée sur la base du deuxième numéro de colonne
Merci pour votre temps @RaviSaroch. Je m'attends à trier uniquement en fonction de la colonne 2. Si 2 lignes de la colonne 2 sont identiques, cela devrait être dans l'ordre d'apparition dans le fichier d'entrée. J'ai déjà essayé la solution dont vous parliez. Si vous observez les résultats que vous avez publiés, lorsque la colonne 2 est la même, elle est triée en fonction de la colonne 1/3. mais je veux que ce soit le même ordre que le fichier d'entrée. Veuillez observer les résultats attendus que j'ai mentionnés dans la question
Copie possible de Trier le fichier CSV par priorité de colonne à l'aide du " commande de tri
La réponse de Glen Jackman est fantastique unix.stackexchange.com/q/345076/273492
ts not duplicate @RaviSaroch Je m'attends à trier uniquement en fonction de la colonne 2. Si 2 lignes de la colonne 2 sont identiques, elles doivent être dans l'ordre d'apparition dans le fichier d'entrée. J'ai déjà essayé la solution dont vous parliez. Merci pour votre temps.
@Raj avez-vous vu cette réponse stackoverflow.com/a/59041272/757714 ? N'est-ce pas ok? Pourquoi? Merci
@aborruso Je ne pourrai pas installer en raison de restrictions administratives. et même si j'installe sur ma machine de développement après avoir obtenu l'approbation, l'installer sur mon serveur de production est un gros travail en raison du grand nombre de processus d'approbation impliqués.