我有一个包含~300k行的文本文件。每行都有不同数量的逗号分隔字段,最后一个字段保证数字。我想通过最后一个数字字段对文件进行排序。我不能这样做:
sort -t, -n -k 2 file.in > file.out
因为每行中的字段数不是常数。我觉得sed,awk也许是答案,但不确定如何。例如:
awk -F, '{print $NF}' file.in
给我最后一列值,但如何使用它来对文件进行排序?
答案 0 :(得分:31)
使用awk将数字键放在前面。 $NF
是当前记录的最后一个字段。分类。使用sed删除重复的密钥。
awk -F, '{ print $NF, $0 }' yourfile | sort -n -k1 | sed 's/^[0-9][0-9]* //'
答案 1 :(得分:2)
vim file.in -c '%sort n /.*,\zs/' -c 'saveas file.out' -c 'q'
答案 2 :(得分:0)
在排序之前,可能会反转文件中每行的字段?像
这样的东西perl -ne 'chomp; print(join(",",reverse(split(","))),"\n")' |
sort -t, -n -k1 |
perl -ne 'chomp; print(join(",",reverse(split(","))),"\n")'
应该这样做,只要逗号从不以任何方式引用。如果这是一个成熟的CSV文件(可以使用反斜杠或空格引用逗号),那么您需要一个真正的CSV解析器。
答案 3 :(得分:0)
Perl one-liner:
@lines=<STDIN>;foreach(sort{($a=~/.*,(\d+)/)[0]<=>($b=~/.*,(\d+)/)[0]}@lines){print;}
答案 4 :(得分:0)
我要把我的东西扔到这里作为替代方案(而且我无法上班):)
示例文件:
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
答案 5 :(得分:0)
Python one-liner:
python -c "print ''.join(sorted(open('filename'), key=lambda l: int(l.split(',')[-1])))"