Команда сортировки оболочки: как отсортировать по последнему столбцу (количество столбцов неизвестно)?

Если данные выглядят следующим образом:

a,b,3
c,d,e,f,2
g,1

Я хочу отсортировать по последнему столбцу. результат должен быть:

g,1
c,d,e,f,2
a,b,3

или есть другой способ?

moasm 26.10.2018 03:49

Передайте его другой команде (например, awk), которая копирует последний столбец на передний план, передайте его в sort, а затем передайте другой команде, которая удаляет первый столбец.

Barmar 26.10.2018 03:52

См. stackoverflow.com/questions/16593463/…

Barmar 26.10.2018 03:53
1
3
427
2

Ответы 2

если последнее поле однозначное

$ rev file | sort | rev

вам может потребоваться добавить -t, -n для сортировки по числовому порядку, но однозначные числа это не имеет значения.

или, в общем случае с awk

$ awk -F, '{a[$NF]=$0} END{n=asorti(a,d); for(k=1;k<=n;k++) print a[d[k]]}' file

g,1
c,d,e,f,2
a,b,3

Это не удастся, если последнее поле не уникально. Используя идиому украсить / сортировать / убрать, вы можете вместо этого написать (как вы сами обнаружили)

$ awk -F, '{print $NF FS $0}' file | sort -n | cut -d, -f2-

безопаснее использовать разделитель полей между ключом и записью, поскольку вы хотите, чтобы FS не отображалась в самом ключе.

но, если есть повторяющиеся числа, результат кажется неверным.

moasm 29.10.2018 10:50

У меня есть глупый, но простой способ сделать это :)

// if original data in the file : ~/Desktop/1.log

$ awk -F, '{print $NF, $0}' ~/Desktop/1.log | sort -n | awk '{print $2}'

g,1

c,d,e,f,2

a,b,3

Другие вопросы по теме