如何用Bash对首列空格不均的空格分隔列表按首数值排序
解决方案
问题根因
原sort -nr命令无法满足需求的核心原因是:作为首列的车型名称包含数量不定的空格,无法通过sort的-k参数固定指定排序字段的位置。
实现思路
通过临时插入排序键的方式实现需求,全程不会修改原有行的空格分隔格式:
- 提取每行首字母后出现的第一个数值作为临时排序键,放到行首
- 按临时排序键做数值正序排序
- 删除临时插入的排序键,还原原始行格式
完整命令
sed -E 's/^[^0-9]*([0-9]+\.?[0-9]*)/\1|&/' 输入文件路径 | sort -n | sed 's/^[^|]*|//'
命令拆解
- 第一个
sed命令:用正则匹配行首所有非数字字符,捕获后续第一个带可选小数点的数值,将数值作为排序键放到行首,用|作为临时分隔符(该分隔符不会出现在你的输入内容中) sort -n命令:按第一列的临时排序键做数值正序排序- 第二个
sed命令:删除行首到|分隔符的所有内容,还原原始行的完整格式,原有空格完全保留
可选:直接修改原文件
如果需要直接修改原文件,可执行如下命令:
sed -E 's/^[^0-9]*([0-9]+\.?[0-9]*)/\1|&/' 输入文件路径 | sort -n | sed 's/^[^|]*|//' > 临时文件 && mv 临时文件 输入文件路径
如果你的系统安装了moreutils工具包,也可以用sponge简化操作:
sed -E 's/^[^0-9]*([0-9]+\.?[0-9]*)/\1|&/' 输入文件路径 | sort -n | sed 's/^[^|]*|//' | sponge 输入文件路径
内容的提问来源于stack exchange,提问作者swangp2
相关产品推荐
相关产品推荐

