我有一个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
快速解释:
$names_sorted
。 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
表示颠倒比较。