[英]Sort by multiple columns in bash
我有一个包含 2 列“名称”和“年龄”的文件,如下所示:
Alex, 15
Mary, 12
Alex, 28
Zoe, 16
Alex, 17
我将按字母顺序按第一列排序,使用sort -t ',' -k1,1 filename.txt
,但如果有相同的名称,我希望第二列以相反的方式排序原始文件,像这样:
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 -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
表示反转结果比较。
哇,看来我误解了你的问题。 我找不到魔术命令,但一个小脚本可能会完成这项工作:
#! /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
恢复该顺序希望这次是你想要的 ;-)
这应该给你想要的:
sort -k1,1 -k2,2 filename.txt
tac filename.txt | sort -t"," -k1,1 -s
解释:
tac
将以相反的顺序对输出进行排序。-t","
定义字段分隔符。-k1,1
将排序列限制为仅第一个。-s
保留已排序行中的顺序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.