Bash:按最后一个字段值排序文本文件

时间:2010-09-30 15:21:57

标签: sorting sed awk

我有一个包含~300k行的文本文件。每行都有不同数量的逗号分隔字段,最后一个字段保证数字。我想通过最后一个数字字段对文件进行排序。我不能这样做:

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

因为每行中的字段数不是常数。我觉得sed,awk也许是答案,但不确定如何。例如:

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

给我最后一列值,但如何使用它来对文件进行排序?

6 个答案:

答案 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])))"