Jak używać awk sortuj według kolumny 3

90

Mam taki plik (user.csv)

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

chcesz wydrukować całą kolumnę posortowaną według użytkownika,

Próbowałem awk -F ":" '{print|"$3 sort -n"}' user.csv, to nie działa.

user2452340
źródło
11
sort -t, -k3 file
Kevin,

Odpowiedzi:

174

Może po prostu sort.

sort -t, -nk3 user.csv

gdzie

  • -t,- definiuje twój separator jako ,.

  • -n- umożliwia sortowanie numeryczne. Dodano, ponieważ dodałeś go w swojej próbie. Jeśli twoje pole użytkownika jest tylko tekstowe, nie potrzebujesz go.

  • -k3- określa pole (klucz). user to trzecie pole.

jaypal singh
źródło
2
Jak mogę użyć sortowania 2 kolumn? na przykład chcę najpierw sortować według kolumny 6, a sortować według kolumny 3 sekundy.
user2452340
1
To nie zadziała, jeśli w pliku CSV znajdują się cytowane ciągi zawierające przecinki (chyba że kolumna, według której chcesz sortować, jest wcześniejsza niż kolumna zawierająca przecinki). Być może będziesz musiał najpierw wykonać przebieg za pomocą awk (używając FPAT = "[^,] * | \" [^ \ "] * \" "i OFS =" | "lub innego separatora, którego możesz użyć z sortowaniem)
davemyron
1
@ user2452340 Możesz to zrobić: sort -t, -nk3 filename.csv | sort -t, -nk6- najpierw posortuje według kolumny 3, a następnie posortuje to według kolumny 6, aby kolumna 6 była poprawnie posortowana w całości i dla wszystkich wierszy, w których kolumna 6 jest taka sama, zostaną posortowane według kolumny 3 .
Mateusz
3
@Matthew sort -t ',' -k3,3n -k6,6nbędzie lepszy. -k3użyje kolumny 3 i reszty wiersza.
Kusalananda
1
Potrzebowałem tylko -t, aby podzielić mój plik z 2 kolumnami podzielony przecinkami, dzięki jaypal
Ricardo Rivera Nieves
20
  1. Użyj awk, aby umieścić identyfikator użytkownika na początku.
  2. Sortować
  3. Użyj seda, aby usunąć zduplikowany identyfikator użytkownika, zakładając, że identyfikatory użytkowników nie zawierają spacji.

    awk -F, '{ print $3, $0 }' user.csv | sort | sed 's/^.* //'
    
user3781670
źródło
Jest to bardzo przydatne, zwłaszcza jeśli musisz przeanalizować lub połączyć kolumny, aby dodać pole sortowania, a następnie zachować tylko oryginalną linię. Użyłem awk / split, aby przeanalizować / połączyć pola daty i czasu w celu sortowania, a następnie usunąć.
skytaker
1
sortjuż wie, jak sortować według określonej kolumny, ale ta technika - znana jako transformata Schwartziana - jest przydatna, gdy pole, według którego chcesz sortować, nie jest w trywialnym przypadku dobrze zdefiniowaną kolumną.
tripleee
10

Możesz wybrać separator, w tym przypadku wybrałem dwukropek i wydrukowałem kolumnę numer jeden, sortując w kolejności alfabetycznej:

awk -F\: '{print $1|"sort -u"}' /etc/passwd
Diego Roberto Dos Santos
źródło
9
awk -F, '{ print $3, $0 }' user.csv | sort -nk2 

i dla odwrotnej kolejności

awk -F, '{ print $3, $0 }' user.csv | sort -nrk2 
vsingh
źródło
6

Spróbuj tego -

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

LUB

sort -t',' -nk3 user.csv
VIPIN KUMAR
źródło
2
awk -F "," '{print $0}' user.csv | sort -nk3 -t ','

To powinno działać

user13608932
źródło
0

Aby wykluczyć pierwszą linię (nagłówek) z sortowania, podzieliłem ją na dwa bufory.

df | awk 'BEGIN{header=""; $body=""} { if(NR==1){header=$0}else{body=body"\n"$0}} END{print header; print body|"sort -nk3"}'
rupert160
źródło