Ответ 1
Используйте awk для установки числового ключа вверх. $NF
- последнее поле текущей записи. Сортировать. Используйте sed для удаления дубликата ключа.
awk -F, '{ print $NF, $0 }' yourfile | sort -n -k1 | sed 's/^[0-9][0-9]* //'
У меня есть текстовый файл, содержащий строки ~ 300 тыс. Каждая строка имеет различное количество полей с разделителями-запятыми, последний из которых гарантированно числен. Я хочу отсортировать файл по этому последнему численному полю. Я не могу:
sort -t, -n -k 2 file.in > file.out
поскольку количество полей в каждой строке не является константой. Я думаю, что sed, awk, может быть, ответ, но не знаю, как это сделать. Например:
awk -F, '{print $NF}' file.in
дает мне последнее значение столбца, но как его использовать для сортировки файла?
Используйте awk для установки числового ключа вверх. $NF
- последнее поле текущей записи. Сортировать. Используйте sed для удаления дубликата ключа.
awk -F, '{ print $NF, $0 }' yourfile | sort -n -k1 | sed 's/^[0-9][0-9]* //'
vim file.in -c '%sort n /.*,\zs/' -c 'saveas file.out' -c 'q'
Может быть, поменять поля каждой строки в файле перед сортировкой? Что-то вроде
perl -ne 'chomp; print(join(",",reverse(split(","))),"\n")' |
sort -t, -n -k1 |
perl -ne 'chomp; print(join(",",reverse(split(","))),"\n")'
должен делать это, если запятые никогда не цитируются каким-либо образом. Если это полноценный CSV файл (в котором запятые могут быть указаны с обратной косой чертой или пробелом), вам нужен настоящий синтаксический анализатор CSV.
Perl однострочный:
@lines=<STDIN>;foreach(sort{($a=~/.*,(\d+)/)[0]<=>($b=~/.*,(\d+)/)[0]}@lines){print;}
Я собираюсь использовать здесь свою альтернативу (и я не мог заставить 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
Однострочный Python:
python -c "print ''.join(sorted(open('filename'), key=lambda l: int(l.split(',')[-1])))"