Bash中按指定列排序失效问题的解决方案

解决方案
空格分隔时列数不统一导致排序错位,核心原因是sort默认的空白分隔规则会将连续多个空格识别为单个分隔符,无法识别空列,根据文件实际排版选对应方案即可:
- 固定宽度对齐的文件(如截图中这类排版整齐的命令输出,每列起始字符位置固定)
无需做分隔符切分,直接指定排序键的字符位置范围,彻底绕开分列错位问题。例如目标排序列从每行第9个字符开始、到第17个字符结束,执行命令:
参数中sort -k 1.9,1.17 你的文件路径1.9代表取整行(排序键第1段)的第9个字符作为排序起点,逗号后1.17为排序键结束位置,不受行内空格数量、缺列情况影响。如果不确定字符位置,可先执行cat -A 你的文件路径,命令会显式展示所有空格、制表符等不可见字符,方便定位。 - 单空格分隔、存在空列的文件(连续空格代表中间列为空值)
先将连续空格替换为文件内容中不存在的临时分隔符,指定分隔符完成排序后再替换回空格即可。例如需要按第3列排序,执行:
命令逻辑:先把2个及以上连续空格替换为sed 's/ \+/|/g' 你的文件路径 | sort -t'|' -k3 | sed 's/|/ /g'|作为临时分隔符,再指定|为列分隔符按第3列排序,最后把|换回空格。如果文件内容本身包含|,替换为其他不会冲突的字符(如不可见控制符\x01)即可。
内容的提问来源于stack exchange,提问作者Abishek
相关产品推荐
相关产品推荐

