You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Linux文件排序问题:按每行最后一个数字排序失败求助

解决按每行最后一个数字排序的问题

嘿,我懂你的困扰——直接用sort -n file.txt没效果,是因为默认情况下sort会按第一列的数值排序,而你需要的是盯着每行最后一个数字来排,对吧?

别担心,咱们只需要给sort明确指定排序的目标列就行,具体命令如下:

sort -k12,12n file.txt

咱们来拆解下这个命令的逻辑:

  • -k12,12:表示仅以第12列作为排序依据(我数了你给的示例行,最后那个数字刚好是第12列)。这里写12,12是明确指定起始和结束列都是12,避免后续列(如果有的话)干扰排序逻辑,对你的场景来说这样写更严谨。
  • -n:依然启用数值排序模式,它能正确识别小数、科学计数法(比如你行里的-9.7705E-02)这类特殊数值格式。

另外你提到每行数字之间有3个空格,这个完全不用纠结——sort默认会把**任意连续的空白字符(空格、制表符等)**当作列分隔符,不管是1个还是3个空格,它都能精准识别每一列。

举个实际例子,假设你的file.txt里有两行内容:

20.799999 13.760000 -15.200000 -10.560000 20.000000 -5.00000 3.90001 -9.7705E-02 -0.95687 -0.167488 0.12431613 -0.7140
10.000000 20.000000 30.000000 40.000000 50.000000 60.00000 70.00001 80.7705E-02 90.95687 10.167488 11.12431613 0.5000

执行上面的命令后,会按最后一列的数值从小到大排序,输出结果会是:

20.799999 13.760000 -15.200000 -10.560000 20.000000 -5.00000 3.90001 -9.7705E-02 -0.95687 -0.167488 0.12431613 -0.7140
10.000000 20.000000 30.000000 40.000000 50.000000 60.00000 70.00001 80.7705E-02 90.95687 10.167488 11.12431613 0.5000

如果你的文件里每行的列数不固定(不是始终12列),可以用更通用的写法,配合awk先关联行号,排序后再还原原行:

awk '{print $0 " " NR}' file.txt | sort -k$(awk '{print NF}' file.txt | head -n1),$(awk '{print NF}' file.txt | head -n1)n | awk '{for(i=1;i<=NF-1;i++) printf "%s ",$i; print ""}'

不过这个是极端情况的备用方案,你当前的场景用第一个命令就完全够用了。

内容的提问来源于stack exchange,提问作者Salah Nouri

火山引擎 最新活动