繁体   English   中英

在bash中按多列排序

[英]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

快速解释:

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM