如何在bash脚本中按Total后的数字对文件内容降序排序并覆盖原文件
实现按Total后数字降序排序并覆盖原文件的方法
原命令失效原因
- 你使用了
&后台执行符而非管道符|,awk既没有指定输入文件,也无法将内容传递给后续的sort命令 - 未指定sort的排序规则,默认会按行首第一个字段排序,不会匹配Total后的数字
- 没有将排序后的结果回写原文件的逻辑,自然不会修改原文件内容
正确实现方案
方案1:使用临时文件实现(兼容性最好,无需额外安装工具)
直接执行以下命令即可:
sort -t: -k2,2nr Result_.txt > tmp_sorted && mv tmp_sorted Result_.txt
参数说明:
-t:指定sort的字段分隔符为冒号-k2,2nr指定仅对第2个字段按数字类型(n)做降序(r)排序- 先写入临时文件再移动替换原文件,避免排序过程中断导致原文件损坏
方案2:使用sponge实现(需先安装moreutils包)
如果系统安装了moreutils,可以直接用sponge接管写入原文件的逻辑:
sort -t: -k2,2nr Result_.txt | sponge Result_.txt
适配原有if判断的写法
如果需要保留先判断文件中是否包含冒号的逻辑,修改后的脚本如下:
if grep -q ':' Result_.txt ;then sort -t: -k2,2nr Result_.txt > tmp_sorted && mv tmp_sorted Result_.txt fi
这里grep加了-q参数实现静默匹配,不会输出多余的匹配内容。
内容的提问来源于stack exchange,提问作者Renas K R
相关产品推荐
相关产品推荐

