【问题标题】:sort alphanumerically with priority for numbers in linux [duplicate]在linux中按数字优先顺序排序[重复]
【发布时间】:2019-03-21 16:35:12
【问题描述】:

我想按字母数字对文件进行排序,但每个文件条目中的数字优先。示例:文件是:

22 FAN
14 FTR
16 HHK
19 KOT
25 LMC
22 LOW
22 MOK
22 RAC
22 SHS
18 SHT
20 TAP
19 TAW
23 TWO
15 UNI

我想把它排序为:

25 LMC
23 TWO
22 FAN
22 LOW
22 MOK
22 RAC
22 SHS
20 TAP
19 KOT
19 TAW
18 SHT
16 HHK
15 UNI
14 FTR

【问题讨论】:

标签: linux bash shell terminal sh


【解决方案1】:

所以,基本上,您要求按降序对第一个字段进行数字排序,但如果数字键相同,您希望第二个字段按 自然 或升序排序, 订购。

我尝试了一些方法,但这是我设法让它发挥作用的方法:

   sort -nk2 file.txt  | sort -snrk1

解释:

  • 第一个命令使用第二个字母数字字段按自然顺序对整个文件进行排序,而第二个命令使用第一个数字字段对输出进行排序,以相反的顺序显示,并要求它是“稳定的" 排序。

  • -n 用于数字排序,而不是字母数字排序,其中 6 在 60 之前。

  • -r 是相反的顺序,所以从高到低。如果未指定,它将采用自然或升序。
  • -k 用于排序顺序的或字段。
  • -s 稳定 订购。此选项维护具有相同键的记录的原始记录顺序。

【讨论】:

  • cat file这里不用了,直接把文件传给sort
  • 这会将文件排序为25 LMC 23 TWO 22 SHS 22 RAC 22 MOK 22 LOW 22 FAN 20 TAP 19 TAW 19 KOT 18 SHT 16 HHK 15 UNI 14 FTR 数字按降序排列,但单词也是如此。我需要按字母顺序对具有相同数字的单词进行排序
  • 新代码有效,谢谢!
  • @AbhinandanVellanki 你能继续接受我的回答吗?
【解决方案2】:

不需要管道,或者它产生的额外子shell。只需对 12 两个字段使用 keydef 即可:

$ sort -k1nr,2 file

示例/输出

$ sort -k1nr,2 file
25 LMC
23 TWO
22 FAN
22 LOW
22 MOK
22 RAC
22 SHS
20 TAP
19 KOT
19 TAW
18 SHT
16 HHK
15 UNI
14 FTR

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 2011-08-31
    • 2020-09-03
    • 1970-01-01
    • 2015-06-23
    相关资源
    最近更新 更多