Jak sortować numerycznie według ostatniej kolumny?

23

Mam ten wkład:

sdkxyosl 1
safkls 2
asdf--asdfasxy_asd 5
dkd8k  jasd 29
sdi44sw 43
asasd afsdfs 10
rklyasd 4

Potrzebuję tego wyjścia:

sdi44sw 43
dkd8k  jasd 29
asasd afsdfs 10
asdf--asdfasxy_asd 5
rklyasd 4
safkls 2
sdkxyosl 1

Więc muszę posortować wiersze według ostatniej kolumny.

Nie wiem, ile kolumn jest w jednym wierszu.

Po prostu nie mogę tego rozgryźć, jak to zrobić. Nie mam „mocy perla”. Po prostu mam ~ średnie moce skryptowe z sed, awk, cut itp.

Czy ktoś wie jak to zrobić?

LanceBaynes
źródło

Odpowiedzi:

34

Następujący wiersz polecenia służy awkdo wstawiania ostatniego pola każdego wiersza pliku file.txt, wykonuje odwrotne sortowanie numeryczne, a następnie używa cutdo usunięcia dodanego pola:

awk '{print $NF,$0}' file.txt | sort -nr | cut -f2- -d' '
forcefsck
źródło
omg ... nie wiedziałem o $ RS !! Dziękuję Ci bardzo!!!!!
LanceBaynes,
@forcefsck: Nie sądzę, że jest to możliwe tylko z sort -k. begfieldFunkcja w GNU sort tylko odliczanie do zera. Wydaje mi się, że twoje podejście do dekorowania i sortowania i dekorowania (DSU) jest najlepszym sposobem.
Mikel
Z braku zainteresowania, dlaczego, $NF,$RSa nie $NF,$0? Nie wiedziałem, $RSże to zrobiłem. (Wydaje mi się, że jest to równoważne z tym $NF,$"\n", co robi to samo, ale myślę, że to również zaskakujące.)
Mikel
2
@ johnny8888, @forcefsck: W awk $może występować dowolne wyrażenie. „ Wpływ wyrażenia numeru pola na wartość całkowitą inną niż nieujemna liczba całkowita jest nieokreślona ”. GNU awk (w moim systemie) traktuje ciąg znaków jak "\n"zero. Inne (np. Oryginalna implementacja A, W i K) przerywają działanie z komunikatem o błędzie. Gdyby przypadkiem RSbyła cyfra, dostaniesz odpowiednie pole dla dowolnej implementacji. Więc nie rób tego, użyj $0.
Gilles „SO- przestań być zły”
1
Naprawdę fajnie! Zatem długie wyjaśnienie tego, co się dzieje: za pomocą awk wypisz najpierw ostatnie pole, a następnie cały rekord, posortuj numerycznie w odwrotnej kolejności, a następnie przytnij pierwszą kolumnę za pomocą cut.
phyatt