【问题标题】:How to sort strings that contain a common prefix and suffix numerically from Bash?如何从 Bash 中对包含公共前缀和后缀的字符串进行数字排序?
【发布时间】:2012-10-16 19:18:15
【问题描述】:

这是一个文件列表:

some.string_100_with_numbers.in-it.txt
some.string_101_with_numbers.in-it.txt
some.string_102_with_numbers.in-it.txt
some.string_23_with_numbers.in-it.txt
some.string_24_with_numbers.in-it.txt
some.string_25_with_numbers.in-it.txt

现在我想对它进行数字排序。以 *23* 开头,以 *102* 结尾。

我试过-n-g-t 对这些凌乱的字符串没有帮助。

我可以忽略带选项的数字的前导字符串还是必须聪明和脚本?

【问题讨论】:

标签: linux bash unix sorting


【解决方案1】:

使用ls -lv

来自手册页:

-v     natural sort of (version) numbers within text

【讨论】:

  • 注意-v 选项到ls 是一个GNU 扩展;既然你在 Linux 上,那没关系,但它不一定可移植到其他系统。
  • 是否有类似的命令使用find 而不是ls(或者可能是管道到sort)?
  • Mac 上可以brew install coreutils 使用gls
  • @becko sort 有 -V 选项,即“文本中(版本)数字的自然排序”
【解决方案2】:

尝试以下方法:

sort -t '_' -k 2n
  • -t '_'(将分隔符设置为下划线字符)
  • -k 2n(使用数字排序按第二列排序)

DEMO.

【讨论】:

  • 没错!这是我忘记的 k 选项,它被“隐藏”在手册页中。
【解决方案3】:

如果可用,只需使用sort -V。这是对版本号的排序,但作为“自然排序”选项效果很好。

$ ff=$( echo some.string_{100,101,102,23,24,25}_with_numbers.in-it.txt )

没有排序:

$ for f in $ff ; do echo $f ; done
some.string_100_with_numbers.in-it.txt
some.string_101_with_numbers.in-it.txt
some.string_102_with_numbers.in-it.txt
some.string_23_with_numbers.in-it.txt
some.string_24_with_numbers.in-it.txt
some.string_25_with_numbers.in-it.txt

使用排序-V:

$ for f in $ff ; do echo $f ; done | sort -V
some.string_23_with_numbers.in-it.txt
some.string_24_with_numbers.in-it.txt
some.string_25_with_numbers.in-it.txt
some.string_100_with_numbers.in-it.txt
some.string_101_with_numbers.in-it.txt
some.string_102_with_numbers.in-it.txt

【讨论】:

    【解决方案4】:

    一般情况下,请尝试Schwartzian transform

    简单地说,将数字分解为自己的字段,对其进行排序,然后丢弃添加的字段。

    # In many shells, use ctrl-v tab to insert a literal tab after the first \2
    sed 's/^\([^0-9]*\)\([0-9][0-9]*\)/\2   \1\2/' file |
    sort -n |
    cut -f2-
    

    如果输入没有明显的分隔符,这很好用,比如下面的输入。

    abc1
    abc10
    abc2
    

    您希望排序将最后一行移到第一行之后的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多