Como ordenar numérico pela última coluna?

23

Eu tenho esta entrada:

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

Eu preciso desta saída:

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

Então, eu preciso classificar as linhas pela última coluna.

Não sei quantas colunas estão em uma linha.

Eu simplesmente não consigo descobrir como fazê-lo. Eu não tenho "poderes perl". Eu apenas tenho ~ poderes médios de script com sed, awk, cut, etc.

Alguém sabe como fazer isso?

LanceBaynes
fonte

Respostas:

34

A seguinte linha de comando usa awkpara incluir o último campo de cada linha de file.txt, faz uma classificação numérica reversa e depois cutremove o campo adicionado:

awk '{print $NF,$0}' file.txt | sort -nr | cut -f2- -d' '
forcefsck
fonte
omg ... eu não sabia sobre o $ RS !! Muito obrigado!!!!!
precisa saber é o seguinte
@forcefsck: Eu não acho que é possível apenas sort -k. A begfieldfunção na classificação GNU conta apenas com zero. Sua abordagem de decorar-classificar-undecorate (DSU) parece ser a melhor maneira que penso.
Mikel
Fora de interesse, por que $NF,$RSe não $NF,$0? Eu não sabia $RSdisso. (Eu acho que é equivalente a $NF,$"\n", que faz o mesmo, mas que também é surpreendente que eu penso.)
Mikel
2
@ johnny8888, @forcefsck: No awk, $pode ser seguido por qualquer expressão. “ O efeito da expressão do número do campo avaliado para algo diferente de um número inteiro não negativo não é especificado ”. O GNU awk (no meu sistema) trata uma string "\n"como zero. Outros (por exemplo, a implementação original de A, W e K) abortam com uma mensagem de erro. Se RSfosse um dígito, você obteria o campo correspondente em qualquer implementação. Então não faça isso, use $0.
Gilles 'SO- stop be evil'
1
Realmente arrumado! Portanto, a longa explicação do que está acontecendo: com awk, imprima primeiro o último campo e depois o registro inteiro, classifique invertidamente numericamente e, em seguida, apare a primeira coluna usando recortar.
Phyatt #