36

以下是文件列表:

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对这些凌乱的字符串没有帮助。

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

4

4 回答 4

44

利用ls -lv

从手册页:

-v     natural sort of (version) numbers within text
于 2012-10-26T14:06:13.710 回答
36

尝试以下操作:

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

演示

于 2012-10-26T14:06:34.063 回答
6

如果可用,只需使用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
于 2018-02-19T15:14:37.810 回答
3

在一般情况下,请尝试Schwartzian 变换

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

# 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

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

于 2016-09-15T08:04:43.640 回答