如何用awk实现多分隔符拆分字符串并按规则交换内容
解决多分隔符拆分字符串并交换内容的awk方案
需求说明
输入字符串示例:'customer_document_map_ocsumm2','customer_ocsumm1','session_detail_ocsumm2'
- 分隔符为
_ - 需将每个元素中最后一个
_分隔的后缀移到前面,用.连接前缀,再添加::regclass - 输出格式:
'ocsumm2.customer_document_map'::regclass,'ocsumm1.customer'::regclass,'ocsumm2.session_detail'::regclass
原代码问题分析
- 遍历数组时用
for(ele in ary),这里ele是数组索引而非元素值,应该按索引顺序遍历 - 拆分的是索引
ele而不是数组元素ary[i] - 用
$NF获取最后一个拆分元素是错误的,$NF指代当前行的最后一个字段,而非拆分后的数组长度,应该用length(ary2) - 未拼接前缀部分,也未生成完整的目标输出格式
正确awk实现代码
BEGIN { # 模拟输入字符串,实际使用时可替换为读取标准输入 input = "'customer_document_map_ocsumm2','customer_ocsumm1','session_detail_ocsumm2'" split(input, ary, /','/) # 清理首尾元素的多余引号 gsub(/^'/, "", ary[1]) gsub(/'$/, "", ary[length(ary)]) for (i=1; i<=length(ary); i++) { elem = ary[i] # 按_拆分当前元素 n = split(elem, parts, "_") # 提取后缀(最后一个拆分部分) suffix = parts[n] # 拼接前缀(前n-1个部分用_连接) prefix = parts[1] for (j=2; j<n; j++) { prefix = prefix "_" parts[j] } # 生成目标格式字符串 result[i] = "'" suffix "." prefix "'::regclass" } # 用逗号连接所有结果并输出 printf "%s\n", result[1] for (i=2; i<=length(result); i++) { printf ",%s", result[i] } print "" }
代码逻辑说明
- 用
split按','拆分输入字符串,得到独立元素数组 - 清理第一个元素的前引号和最后一个元素的后引号
- 遍历每个元素,按
_拆分后,提取最后一段作为后缀,将前面所有段拼接为前缀 - 按照
'后缀.前缀'::regclass格式生成每个结果项 - 最后用逗号连接所有结果并打印
如果需要从标准输入读取内容(比如管道传参),可以使用以下简化版本:
{ split($0, ary, /','/) gsub(/^'/, "", ary[1]) gsub(/'$/, "", ary[length(ary)]) for (i=1; i<=length(ary); i++) { elem = ary[i] n = split(elem, parts, "_") suffix = parts[n] prefix = parts[1] for (j=2; j<n; j++) { prefix = prefix "_" parts[j] } result[i] = "'" suffix "." prefix "'::regclass" } printf "%s", result[1] for (i=2; i<=length(result); i++) { printf ",%s", result[i] } print "" }
使用示例:
echo "'customer_document_map_ocsumm2','customer_ocsumm1','session_detail_ocsumm2'" | awk -f script.awk
内容的提问来源于stack exchange,提问作者Yasser
相关产品推荐
相关产品推荐

