分号分隔CSV保留表头排序:外部awk调用的字段分隔符问题
解决分号分隔CSV文件的表头保留排序问题
我来帮你搞定这个问题~你遇到的核心问题是shell会把分号当成命令分隔符,导致你传给sort的参数被拆成了两部分,自然没法正确按分号分隔的字段排序。
先看你出错的原因
你写的命令:
cat temp1 | awk 'NR==1; NR > 1 {print $0 | "sort -t=";" -k2"}'
这里的分号;在shell里是用来分隔命令的,所以shell会把sort -t=和-k2当成两个独立的命令,sort根本没收到正确的分隔符参数,只能用默认的空格来排序,结果自然不对。
正确的几种写法
方法1:转义分号
在awk的字符串里给分号加反斜杠转义,让shell把它当成普通字符:
cat temp1 | awk 'NR==1; NR>1 {print $0 | "sort -t\; -k2"}'
方法2:用单引号包裹分号(更稳妥)
把sort的分隔符参数用单引号括起来,避免shell解析分号,这里要注意awk字符串的嵌套写法:
cat temp1 | awk 'NR==1; NR>1 {print $0 | "sort -t'\'';'\'' -k2"}'
这里'\''是shell里插入单引号的技巧,最终传给sort的参数是-t';',完全符合要求。
方法3:去掉多余的cat(更高效)
awk可以直接读取文件,没必要用cat传递,简化成:
awk 'NR==1; NR>1 {print $0 | "sort -t'\'';'\'' -k2"}' temp1
验证结果
执行上面的正确命令后,你会得到预期的输出:
a;b;c;d;e 3;1;2;3;1 1;2;3;4;5 2;3;1;2;3
补充说明
为什么逗号分隔的时候没问题?因为逗号不是shell的特殊字符,sort -t,里的逗号会被直接传给sort,所以能正常工作;而分号是shell的命令分隔符,必须转义或用引号包裹才能让sort正确识别它作为字段分隔符。
内容的提问来源于stack exchange,提问作者User1234141414
相关产品推荐
相关产品推荐

