按bash中的多列进行sorting

我有一个2列“名称”和“年龄”的文件,看起来像这样:

Alex, 15 Mary, 12 Alex, 28 Zoe, 16 Alex, 17 

我将按字母顺序对第一列进行sorting,使用sort -t ',' -k1,1 filename.txt ,但是如果有相同的名字,我希望第二列按照它们的反向sorting原始文件,如下所示:

 Alex, 17 Alex, 28 Alex, 15 Mary, 12 Zoe, 17 

我怎样才能做到这一点?

从后面读取文件,按第一列进行排序,如果值相同,则按-s保存顺序

 tac filename.txt | sort -k1,1 -s ... Alex, 17 Alex, 28 Alex, 15 Mary, 12 Zoe, 16 

这应该给你想要的:

 sort -k1,1 -k2,2 filename.txt 

呃,似乎我误解了你的问题。 我找不到一个神奇的命令,但一个小脚本可能会完成这个工作:

 #! /bin/bash declare names_sorted=$(cut -d, -f1 filename.txt | sort -k1,1 | uniq) for name in $names_sorted ; do grep "$name," filename.txt | tac done 

快速解释:

  1. 首先我们组装排序的名称列表: $names_sorted
  2. 接下来(假设名称不包含空格),我们从原始列表中grep每个名字,并使用命令tac

希望这是你想要的这一次;-)

不知道你为什么要这样做! 但你可以很容易地做到这一点(不保留空格):

 import sys entries = [tuple(map(lambda x: x.strip(), line.strip().split(","))) for line in sys.stdin] names,ages = zip(*entries) def compare(a,b): res = cmp(a[0], b[0]) if (res == 0): return -cmp(ages.index(a[1]), ages.index(b[1])) return res print "\n".join("%s %s" % (name,age) for name,age in sorted(entries, cmp=compare)) 
 sort -t ',' -k1,1 -k2,2r filename.txt 

要么

 sort -t ',' -k1,1 -k2r,2 filename.txt 

输出是:

 Alex, 28 Alex, 17 Alex, 15 Mary, 12 Zoe, 16 

说明: -t是指定字段分隔符, -k可以用来指定字段的开始和停止位置,并且我们可以为该字段添加单个字母OPTS以用于排序,例如r表示颠倒比较。