如何通过CLI工具或Bash代码按人工认定的第5列排序文本
用CLI/Bash按指定人工列排序文本的方法
针对你描述的文本结构(人工认定6列,第1列含1-4个非空格串,其余列均为单个非空格串,需按人工第5列排序),可以用以下几种方法实现:
方法1:简单排序(不严格保留原缩进空白)
适合对文本格式要求不高,仅需内容排序的场景:
awk '{print $(NF-1), $0}' input.txt | sort -n | cut -d' ' -f2-
步骤说明:
awk '{print $(NF-1), $0}':提取每行的倒数第二个字段(即人工第5列),将其放在行首作为排序键,后跟原行内容sort -n:按数字顺序排序(若人工第5列是字符串,去掉-n即可)cut -d' ' -f2-:移除行首的排序键,还原原行内容
方法2:保留原格式排序(严格保留缩进和空白)
如果需要完整保留文本原有缩进、空格排版,用空字符作为分隔符避免破坏格式:
awk -v OFS='\0' '{print $(NF-1), $0}' input.txt | sort -n -z | awk -v FS='\0' '{print $2}'
步骤说明:
awk -v OFS='\0' '{print $(NF-1), $0}':用空字符(\0)分隔排序键和原行,确保原行空白不被干扰sort -n -z:按数字排序,同时支持空字符分隔的行输入awk -v FS='\0' '{print $2}':按空字符拆分内容,输出原行,完整保留原有排版
示例验证
用你提供的示例文本测试:
输入:
1 2 3 4 5 6 foo bar x y z 9 z foo z x y 3 z foo bar baz k l m 1 n
执行方法2的命令后,输出会按人工第5列从小到大排序:
1 2 3 4 5 6 foo bar baz k l m 1 n foo z x y 3 z foo bar x y z 9 z
内容的提问来源于stack exchange,提问作者Dumb
相关产品推荐
相关产品推荐

