1
votes

Tri du fichier csv basé sur la colonne 2 uniquement. si 2 lignes de la colonne 2 sont identiques, il ne doit s'agir que de l'ordre des fichiers d'entrée. ne doit pas trier en fonction d'une autre colonne

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


5 commentaires

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.


3 Réponses :


0
votes

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


2 commentaires

"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



0
votes

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


2 commentaires

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.



1
votes

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


1 commentaires

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