You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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 ""
}

代码逻辑说明

  1. 用split按','拆分输入字符串,得到独立元素数组
  2. 清理第一个元素的前引号和最后一个元素的后引号
  3. 遍历每个元素,按_拆分后,提取最后一段作为后缀,将前面所有段拼接为前缀
  4. 按照'后缀.前缀'::regclass格式生成每个结果项
  5. 最后用逗号连接所有结果并打印

如果需要从标准输入读取内容(比如管道传参),可以使用以下简化版本:

{
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 02:57:50