-n- vous donne un tri numérique. Ajouté depuis que vous l'avez ajouté lors de votre tentative. Si votre champ utilisateur est uniquement du texte, vous n'en avez pas besoin.
-k3- définit le champ (clé). l'utilisateur est le troisième champ.
Comment puis-je utiliser les colonnes de tri 2? par exemple, je veux trier d'abord par colonne 6, puis par colonne 3 secondes.
user2452340
1
Cela ne fonctionnera pas s'il y a des chaînes entre guillemets contenant des virgules dans le CSV (à moins que la colonne que vous souhaitez trier soit antérieure à la colonne contenant des virgules). Vous devrez peut-être faire un passage d'abord avec awk (en utilisant FPAT = "[^,] * | \" [^ \ "] * \" "et OFS =" | "ou un autre délimiteur que vous pourriez utiliser avec sort)
davemyron
1
@ user2452340 Vous pouvez faire ceci: sort -t, -nk3 filename.csv | sort -t, -nk6- d'abord il triera par colonne 3, puis triera par colonne 6 afin que la colonne 6 soit triée correctement jusqu'au bout et pour toutes les lignes où la colonne 6 est la même, celles-ci seront triées par colonne 3 .
Matthew le
3
@Matthew sort -t ',' -k3,3n -k6,6nsera meilleur. -k3utilisera la colonne 3 et le reste de la ligne.
Kusalananda le
1
J'avais juste besoin du -t, pour diviser mon fichier de 2 colonnes divisé par des virgules, merci jaypal
Ricardo Rivera Nieves
20
Utilisez awk pour placer l'ID utilisateur devant.
Trier
Utilisez sed pour supprimer l'ID utilisateur en double, en supposant que les ID utilisateur ne contiennent aucun espace.
Ceci est très utile, en particulier si vous devez analyser ou combiner des colonnes pour ajouter un champ de tri, puis ne conserver que la ligne d'origine. J'ai utilisé awk / split pour analyser / combiner les champs de date et d'heure pour un tri, puis supprimer.
skytaker
1
sortsait déjà comment trier selon une colonne particulière, mais cette technique - connue sous le nom de transformée de Schwartz - est utile lorsque le champ sur lequel vous souhaitez trier n'est pas trivialement une colonne bien définie.
tripleee
10
Vous pouvez choisir un délimiteur, dans ce cas, j'ai choisi un deux-points et imprimé la colonne numéro un, en triant par ordre alphabétique:
sort -t, -k3 file
Réponses:
Que diriez-vous juste
sort
.sort -t, -nk3 user.csv
où
-t,
- définit votre délimiteur comme,
.-n
- vous donne un tri numérique. Ajouté depuis que vous l'avez ajouté lors de votre tentative. Si votre champ utilisateur est uniquement du texte, vous n'en avez pas besoin.-k3
- définit le champ (clé). l'utilisateur est le troisième champ.la source
sort -t, -nk3 filename.csv | sort -t, -nk6
- d'abord il triera par colonne 3, puis triera par colonne 6 afin que la colonne 6 soit triée correctement jusqu'au bout et pour toutes les lignes où la colonne 6 est la même, celles-ci seront triées par colonne 3 .sort -t ',' -k3,3n -k6,6n
sera meilleur.-k3
utilisera la colonne 3 et le reste de la ligne.Utilisez sed pour supprimer l'ID utilisateur en double, en supposant que les ID utilisateur ne contiennent aucun espace.
awk -F, '{ print $3, $0 }' user.csv | sort | sed 's/^.* //'
la source
sort
sait déjà comment trier selon une colonne particulière, mais cette technique - connue sous le nom de transformée de Schwartz - est utile lorsque le champ sur lequel vous souhaitez trier n'est pas trivialement une colonne bien définie.Vous pouvez choisir un délimiteur, dans ce cas, j'ai choisi un deux-points et imprimé la colonne numéro un, en triant par ordre alphabétique:
awk -F\: '{print $1|"sort -u"}' /etc/passwd
la source
awk -F, '{ print $3, $0 }' user.csv | sort -nk2
et pour l'ordre inverse
awk -F, '{ print $3, $0 }' user.csv | sort -nrk2
la source
essaye ça -
awk '{print $0|"sort -t',' -nk3 "}' user.csv
OU
sort -t',' -nk3 user.csv
la source
awk -F "," '{print $0}' user.csv | sort -nk3 -t ','
Cela devrait fonctionner
la source
Pour exclure la première ligne (en-tête) du tri, je l'ai divisée en deux tampons.
df | awk 'BEGIN{header=""; $body=""} { if(NR==1){header=$0}else{body=body"\n"$0}} END{print header; print body|"sort -nk3"}'
la source