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.


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.


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/^.* //'
    

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

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

i dla odwrotnej kolejności

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

6

Spróbuj tego -

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

LUB

sort -t',' -nk3 user.csv


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"}'
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.