Come utilizzare awk sort per colonna 3


92

Ho un file (user.csv) come questo

ip,hostname,user,group,encryption,aduser,adattr

vuoi stampare tutte le colonne ordinate per utente,

Ho provato awk -F ":" '{print|"$3 sort -n"}' user.csv, non funziona.


12
sort -t, -k3 file
Kevin,

Risposte:


181

Che ne dici di appena sort.

sort -t, -nk3 user.csv

dove

  • -t,- definisce il delimitatore come ,.

  • -n- ti dà l'ordinamento numerico. Aggiunto da quando l'hai aggiunto nel tuo tentativo. Se il campo utente è solo testo, non ne hai bisogno.

  • -k3- definisce il campo (chiave). utente è il terzo campo.


2
Come posso utilizzare Ordina 2 colonne? ad esempio, voglio prima ordinare per colonna 6 e ordinare per colonna 3 secondi.
user2452340

1
Ciò non funzionerà se sono presenti stringhe tra virgolette contenenti virgole nel CSV (a meno che la colonna in base alla quale si desidera ordinare non sia precedente alla colonna contenente virgole). Potrebbe essere necessario eseguire un passaggio prima con awk (utilizzando FPAT = "[^,] * | \" [^ \ "] * \" "e OFS =" | "o qualche altro delimitatore che potresti usare con sort)
davemyron

1
@ user2452340 Puoi fare questo: sort -t, -nk3 filename.csv | sort -t, -nk6- prima ordinerà per colonna 3, poi lo ordinerà per colonna 6 in modo che la colonna 6 sia ordinata correttamente fino in fondo e per tutte le righe in cui la colonna 6 è la stessa, quelle saranno ordinate per colonna 3 .
Matteo

3
@ Matteo sort -t ',' -k3,3n -k6,6nandrà meglio. -k3utilizzerà la colonna 3 e il resto della riga.
Kusalananda

1
Avevo solo bisogno della -t, per dividere il mio file di 2 colonne diviso per virgole, grazie jaypal
Ricardo Rivera Nieves

22
  1. Usa awk per mettere l'ID utente davanti.
  2. Ordinare
  3. Utilizzare sed per rimuovere l'ID utente duplicato, supponendo che gli ID utente non contengano spazi.

    awk -F, '{ print $3, $0 }' user.csv | sort | sed 's/^.* //'
    

Ciò è molto utile, soprattutto se è necessario analizzare o combinare colonne per aggiungere un campo di ordinamento, quindi mantenere solo la riga originale. Ho usato awk / split per analizzare / combinare i campi data e ora per un ordinamento, quindi rimuovere.
Skytaker

1
sortsa già come ordinare in base a una particolare colonna, ma questa tecnica, nota come trasformata di Schwartz , è utile quando il campo su cui si desidera ordinare non è banalmente una colonna ben definita.
tripleee

11

Puoi scegliere un delimitatore, in questo caso ho scelto i due punti e ho stampato la colonna numero uno, ordinando in ordine alfabetico:

awk -F\: '{print $1|"sort -u"}' /etc/passwd

9
awk -F, '{ print $3, $0 }' user.csv | sort -nk2 

e per l'ordine inverso

awk -F, '{ print $3, $0 }' user.csv | sort -nrk2 

6

prova questo -

awk '{print $0|"sort -t',' -nk3 "}' user.csv

O

sort -t',' -nk3 user.csv

3
awk -F "," '{print $0}' user.csv | sort -nk3 -t ','

Questo dovrebbe funzionare


0

Per escludere la prima riga (intestazione) dall'ordinamento, l'ho divisa in due buffer.

df | awk 'BEGIN{header=""; $body=""} { if(NR==1){header=$0}else{body=body"\n"$0}} END{print header; print body|"sort -nk3"}'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.