该数据集最简单的技巧是将第二列视为版本号。
$ cat Data3 | sort -k2,2V -t'|'
Help Text|50001/100/7
My Message|50001/100/7
Visible Text|50001/100/52
Text Message|50001/100/63
Invisible Text|50002/100/1
Help Message|50002/100/11
My Text|50002/100/43
但是,这并不总是有效,具体取决于您的输入。这将起作用,因为第二列中的值是相同的。
您可以按照 fedorqui 的建议执行两次排序,第二次执行稳定排序。从手册页:-s,--stable(通过禁用最后的比较来稳定排序)
首先按次要排序标准排序。然后进行稳定排序,将排序顺序保持在与主排序条件共享相同键的行内。
$ cat Data3 | sort -k3,3n -t'/' | sort -k2,2n -t'|' -s
Help Text|50001/100/7
My Message|50001/100/7
Visible Text|50001/100/52
Text Message|50001/100/63
Invisible Text|50002/100/1
Help Message|50002/100/11
My Text|50002/100/43
在这种情况下你有点幸运,因为 -k2,2n -t'|' 会将第二列“50001/100/7”视为一个数字,可能是 50001。如果用逗号分隔而不是斜杠,并且您在环境中使用不同的语言环境,您最终可能会遇到奇怪的情况。例如,在我的环境中,我默认运行 en_US.UTF-8,它的行为是这样的。
$ cat Data3 | tr '/' ',' | sort -k3,3n -t',' | LC_NUMERIC=en_US.UTF-8 sort -k2,2n -t'|' -s
Help Text|50001,100,7
My Message|50001,100,7
Invisible Text|50002,100,1
Visible Text|50001,100,52
Text Message|50001,100,63
Help Message|50002,100,11
My Text|50002,100,43
你所期望的是:
$ cat Data3 | tr '/' ',' | sort -k3,3n -t',' | LC_NUMERIC=C sort -k2,2n -t'|' -s
Help Text|50001,100,7
My Message|50001,100,7
Visible Text|50001,100,52
Text Message|50001,100,63
Invisible Text|50002,100,1
Help Message|50002,100,11
My Text|50002,100,43