如何在shell中对复杂的字符串排序?

时间:2018-08-28 16:28:10

标签: bash shell perl sorting awk

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

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

无济于事。

有任何线索吗?

4 个答案:

答案 0 :(得分:5)

您似乎想按字母顺序对字段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

答案 1 :(得分:1)

仍然有很多不清楚的地方(您并不是在说您想要的输出),但是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

答案 2 :(得分:1)

perl -MSort::Key::Natural=natsort -e'print for natsort <>'

有关用法,请参见Specifying file to process to Perl one-liner

答案 3 :(得分:0)

版本排序

$ 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