【问题标题】:How to sort complicated strings in shell?如何在shell中对复杂的字符串进行排序?
【发布时间】:2019-02-03 08:40:34
【问题描述】:

我必须像这样对单元格名称进行排序(不管它来自文件还是变量):预期结果

BAR.A1
BAR.A1-1
BAR.A2
BAR.A3
BAR.A10
FOO.A1
FOO.B1
FOO.B1-1

我尝试的结果是这个错误的顺序:

BAR.A1
BAR.B1
BAR.B1-1
FOO.A1
FOO.A10 <--- wrong place
FOO.A1-1
FOO.A2
FOO.A3

我尝试了很多组合

sort -n
sort -h
sort -d

没有任何作用。

有什么线索吗?

【问题讨论】:

  • 您给出了一个输出示例,其中一个字段位于错误的位置,您能否编辑问题以显示您希望看到的输出?
  • 预期的是第一个列表。如果您有足够的声望点,请编辑(我没有)
  • 你想让FOO排在BAR之前?
  • 所以你想在点之前按降序排列,在点之后按字母+数字升序排列?格式是否总是三个字符、一个点、一个字母,然后是一些数字或连字符?
  • 请在您的问题中添加示例输入和该示例输入所需的输出。

标签: bash shell perl sorting awk


【解决方案1】:

您似乎想按字段 1 按字母顺序排序,然后按字段 2 版本排序

sort -t. -k 1,1 -k2,2V <<END
FOO.A1
FOO.A1-1
FOO.A2
FOO.A3
FOO.A10
BAR.A1
BAR.B1
BAR.B1-1
END
BAR.A1
BAR.B1
BAR.B1-1
FOO.A1
FOO.A1-1
FOO.A2
FOO.A3
FOO.A10

【讨论】:

    【解决方案2】:

    还有很多不清楚的地方(你并没有准确地说出你想要的输出)但是sort -g应该这样做:

    $ cat s.txt
    FOO.A1
    FOO.A1-1
    FOO.A2
    FOO.A3
    FOO.A10
    BAR.A1
    BAR.B1
    BAR.B1-1
    $ sort -g s.txt
    BAR.A1
    BAR.B1
    BAR.B1-1
    FOO.A1
    FOO.A1-1
    FOO.A10
    FOO.A2
    FOO.A3
    

    -g 是这样定义的:

    -g, --general-numeric-sort, --sort=general-numeric 按一般数值排序。与 -n 不同,此选项处理一般浮点数。它的格式比 -n 允许的格式更宽松,但存在明显的性能缺陷。

    但是-n 也适合这里,所以你想要的输出不清楚。

    根据您的进一步更新,也许这就是您想要的:

    $ sort -t '.' -k 2 -V < s.txt
    BAR.A1
    FOO.A1
    FOO.A1-1
    FOO.A2
    FOO.A3
    FOO.A10
    BAR.B1
    BAR.B1-1
    

    【讨论】:

    • FOO.A10 应该在FOO.A3 之后
    • @MévatlavéKraspek 查看更新。您的问题对您想要实现的目标非常不清楚/具有误导性。
    • 抱歉@Patrick Mevzek 我的描述不好,没有足够的声誉点来自己编辑我的帖子。
    • 你的最后一个命令很好,谢谢,已经接受了另一个
    【解决方案3】:
    perl -MSort::Key::Natural=natsort -e'print for natsort <>'
    

    使用方法见Specifying file to process to Perl one-liner

    【讨论】:

      【解决方案4】:

      版本排序

      $ sort -V file
      
      BAR.A1
      BAR.B1
      BAR.B1-1
      FOO.A1
      FOO.A2
      FOO.A3
      FOO.A10
      FOO.A1-1
      

      更新基于已澄清的问题

      $ sort -t- -k1,1V -k2 file
      
      BAR.A1
      BAR.B1
      BAR.B1-1
      FOO.A1
      FOO.A1-1
      FOO.A2
      FOO.A3
      FOO.A10
      

      【讨论】:

      • FOO.A1-1 应该在 FOO.A10 之前
      • 'like this' 表示这是我的预期,如果不够清楚,请见谅
      • @Mévatlavé:您写道“我必须像这样对单元格名称进行排序”,这意味着单元格名称是“像这样”,而不是它们的排序方式。看起来您正在显示输入数据。
      • @Borodin:抱歉我的描述不好,但格伦杰克曼明白我的意思。我喜欢编辑,但我没有任何声望点可以这样做。我的道歉
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-25
      • 2015-09-02
      • 2012-03-24
      • 1970-01-01
      • 2011-01-23
      • 2017-08-11
      • 1970-01-01
      相关资源
      最近更新 更多