unix排序为2个字段的数字顺序

jde*_*dex 5 unix sorting bash awk sed

我需要使用unix排序对一些数据进行排序,但我无法确切地说出正确的语法,数据看起来像

3.9.1 Step 10:
3.9.1 Step 20:
3.8.10 Step 20:
3.10.2 Step 10:
3.8.4 Step 90:
3.8.4 Step 100:
3.8.4 Step 10:
Run Code Online (Sandbox Code Playgroud)

我想首先使用主要数字,然后是步骤编号对其进行排序,例如,上面排序的数据看起来像.

3.8.4 Step 10:
3.8.4 Step 90:
3.8.4 Step 100:
3.8.10 Step 20:
3.9.1 Step 10:
3.9.1 Step 20:
3.10.2 Step 10:
Run Code Online (Sandbox Code Playgroud)

我找到了按此网站上的第一个数字排序的方法:

sort -t. -k 1,1n -k 2,2n -k 3,3n
Run Code Online (Sandbox Code Playgroud)

但我现在正在努力排序第3列步骤编号,而不会打扰第一类

Jon*_*ler 2

有一篇关于重新设计 Unix 的精彩文章sort(“构建工作排序例程的理论与实践”,JP Linderman,AT&T 贝尔实验室技术期刊,1984 年 10 月),不幸的是,该文章在互联网上无法找到,AFAICT(我大约一年前看过,没有找到它;我刚才又看了一遍,可以找到它的参考资料,但找不到文章本身)。除其他外,本文证明,对于 Unix sort,比较时间远远超过移动数据的成本(当您考虑到比较必须比较每行确定的字段时,这并不奇怪,但移动“数据”只是一个切换问题周围的指针)。结果之一是他们建议按照danfuzz 的建议去做;映射键以使比较变得容易。他们表明,与让排序工作变得非常困难相比,即使是简单的脚本解决方案也可以节省时间。

因此,您可以考虑使用不太可能自然出现在数据文件中的字符(例如Control-A)作为关键字段分隔符。

sed 's/^\([^.]*\)[.]\([^.]*\)[.]\([^ ]*\) Step \([0-9]*\):.*/\1^A\2^A\3^A\4^A&/' file |
sort -t'^A' -k1,1n -k2,2n -k3,3n -k4,4n |
sed 's/^.*^A//'
Run Code Online (Sandbox Code Playgroud)

第一个命令是困难的。它识别 4 个数字字段,并输出用所选字符(^A上面写的,键入为Control-A)分隔的它们,然后输出原始行的副本。然后,排序会按数字对前四个字段进行排序,最后的sed命令会删除每行的前面,直到最后一行(包括最后一行)Control-A,再次返回原始行。