Как выполнить числовую сортировку по последнему столбцу?

23

У меня есть этот вход:

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

Мне нужен этот вывод:

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

Поэтому мне нужно отсортировать строки по последнему столбцу.

Я не знаю, сколько столбцов в одной строке.

Я просто не могу понять, как это сделать. У меня нет "способностей perl". Я просто имею средние полномочия по написанию сценариев с помощью sed, awk, cut и т.д ..

Кто-нибудь знает, как это сделать?

LanceBaynes
источник

Ответы:

34

Следующая командная строка используется awkдля добавления последнего поля каждой строки файла file.txt, выполняет обратную числовую сортировку, а затем использует cutдля удаления добавленное поле:

awk '{print $NF,$0}' file.txt | sort -nr | cut -f2- -d' '
forcefsck
источник
о боже ... я не знал о $ RS !! большое Вам спасибо!!!!!
LanceBaynes
@forcefsck: я не думаю, что это возможно только с sort -k. begfieldФункция в GNU рода просто отсчитывает до нуля. Я думаю, что ваш подход декорации-сортировки-декорации (DSU) кажется лучшим.
Микель
Из интереса, а почему бы $NF,$RSи нет $NF,$0? Я не знал, $RSсделал это. (Полагаю, это эквивалентно тому $NF,$"\n", что делает то же самое, но я думаю, что это тоже удивительно.)
Mikel
2
@ johnny8888, @forcefsck: в awk $может следовать любое выражение. « Эффект выражения числа поля, оценивающего что-либо кроме неотрицательного целого числа, не определен ». GNU awk (в моей системе) рассматривает строку "\n"как ноль. Другие (например, исходная реализация A, W и K) прерывают с сообщением об ошибке. Если RSэто будет цифра, вы получите соответствующее поле в любой реализации. Так что не делай этого, пользуйся $0.
Жиль "ТАК - перестань быть злым"
1
Действительно аккуратно! Итак, длинное объяснение того, что происходит: с помощью awk сначала выведите последнее поле, затем всю запись, выполните числовую сортировку в обратном порядке, а затем обрежьте первый столбец, используя cut.
Phyatt