Bash: сортировка текстового файла по последнему значению поля - PullRequest
23 голосов
/ 30 сентября 2010

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

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

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

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

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

Ответы [ 6 ]

31 голосов
/ 30 сентября 2010

Используйте awk, чтобы поставить цифровую клавишу впереди. $NF - последнее поле текущей записи. Сортировать. Используйте sed, чтобы удалить дубликат ключа.

awk -F, '{ print $NF, $0 }' yourfile | sort -n -k1 | sed 's/^[0-9][0-9]* //'
2 голосов
/ 30 сентября 2010
vim file.in -c '%sort n /.*,\zs/' -c 'saveas file.out' -c 'q'
0 голосов
/ 06 сентября 2017

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

python -c "print ''.join(sorted(open('filename'), key=lambda l: int(l.split(',')[-1])))"
0 голосов
/ 11 ноября 2014

Я собираюсь добавить сюда свою альтернативу (и я не смог заставить работать 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
0 голосов
/ 01 октября 2010

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

@lines=<STDIN>;foreach(sort{($a=~/.*,(\d+)/)[0]<=>($b=~/.*,(\d+)/)[0]}@lines){print;}
0 голосов
/ 30 сентября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...