Подтвердить что ты не робот

Bash: сортировать текстовый файл по последнему значению поля

У меня есть текстовый файл, содержащий строки ~ 300 тыс. Каждая строка имеет различное количество полей с разделителями-запятыми, последний из которых гарантированно числен. Я хочу отсортировать файл по этому последнему численному полю. Я не могу:

sort -t, -n -k 2 file.in > file.out

поскольку количество полей в каждой строке не является константой. Я думаю, что sed, awk, может быть, ответ, но не знаю, как это сделать. Например:

awk -F, '{print $NF}' file.in

дает мне последнее значение столбца, но как его использовать для сортировки файла?

4b9b3361

Ответ 1

Используйте awk для установки числового ключа вверх. $NF - последнее поле текущей записи. Сортировать. Используйте sed для удаления дубликата ключа.

awk -F, '{ print $NF, $0 }' yourfile | sort -n -k1 | sed 's/^[0-9][0-9]* //'

Ответ 2

vim file.in -c '%sort n /.*,\zs/' -c 'saveas file.out' -c 'q'

Ответ 3

Может быть, поменять поля каждой строки в файле перед сортировкой? Что-то вроде

perl -ne 'chomp; print(join(",",reverse(split(","))),"\n")' |
  sort -t, -n -k1 |
  perl -ne 'chomp; print(join(",",reverse(split(","))),"\n")'

должен делать это, если запятые никогда не цитируются каким-либо образом. Если это полноценный CSV файл (в котором запятые могут быть указаны с обратной косой чертой или пробелом), вам нужен настоящий синтаксический анализатор CSV.

Ответ 4

Perl однострочный:

@lines=<STDIN>;foreach(sort{($a=~/.*,(\d+)/)[0]<=>($b=~/.*,(\d+)/)[0]}@lines){print;}

Ответ 5

Я собираюсь использовать здесь свою альтернативу (и я не мог заставить awk работать):)

образец файла:

Call of Doody                           1322
Seam the Ripper                         1329
Mafia Bots 1                            1109
Chicken Fingers                         1243
Batup Light                             1221
Hunter F Tomcat                         1140
Tober                                   0833

код:

for i in `sed -e 's/.* \(\d\)*/\1/' file.txt | sort`; do grep $i file.txt; done > file_sort.txt

Ответ 6

Однострочный Python:

python -c "print ''.join(sorted(open('filename'), key=lambda l: int(l.split(',')[-1])))"