如何用awk处理多分隔符文本:解决引号转义与逗号去重问题
解决awk处理文本的两个问题
问题1:正确将双引号设为分隔符
你之前的命令里,FS用双引号包裹导致shell提前解析了引号,无法把双引号当作分隔符。解决方法是用单引号包裹FS的正则表达式,shell会把单引号内的所有字符当作原义处理,双引号就能被加入到分隔符集合中:
# 用-F参数指定字段分隔符,单引号包裹包含双引号的字符集 awk -F '[!;^}"8-]' ...
或者在awk脚本内部定义FS时用单引号:
awk 'BEGIN{FS="[!;^}"8-]"} ...' file.txt
问题2:消除重复逗号、末尾逗号,合并内容为单行
原来的$1=$1方式会保留连续分隔符产生的空字段,且按行输出,无法得到目标格式。可以通过收集非空字段到数组,最后统一拼接的方式解决:
最终完整命令
awk -F '[!;^}"8-]' '{ for(i=1; i<=NF; i++) { if($i != "") { # 过滤空字段,避免重复逗号 arr[++count] = $i } } } END { # 遍历数组拼接,最后一个字段不加逗号 for(i=1; i<=count; i++) { printf "%s%s", arr[i], (i == count ? "" : ",") } print "" # 最后添加换行 }' file.txt
命令说明
-F '[!;^}"8-]':将!、;、^、"、}、8、-全部设为字段分隔符,单引号确保双引号被正确识别。- 遍历每行的所有字段,只把非空字段存入数组
arr,避免连续分隔符产生的空字段导致重复逗号。 - END块中遍历数组,用
printf控制输出:除最后一个字段外,每个字段后加逗号,最后手动换行。
执行该命令后,file.txt中的内容会被转换为:
a,b,c,d,e,f,g,h,i,j
内容的提问来源于stack exchange,提问作者Son1c
相关产品推荐
相关产品推荐

