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

文本列拆分需求:AWK脚本处理空值列异常问题求助

AWK脚本修复:处理空第5列并正确拆分多值列

我需要处理竖线分隔的文本,将第5列的分号分隔项拆分为三个竖线分隔的列,示例输入如下:

A|B|C|D| 3#1#1#;1#4#4;5#1#4;|E|F|0
AE|B1|CC|DE| |EX|FF|0
AR|BE|CA|D1| 5#6#3#;4#3#4;|ED|G|

期望输出:

A|B|C|D| 3#1#1#;1#4#4;5#1#4;|E|F|0|3|1|1
A|B|C|D| 3#1#1#;1#4#4;5#1#4;|E|F|0|1|4|4
A|B|C|D| 3#1#1#;1#4#4;5#1#4;|E|F|0|5|1|4
AE|B1|CC|DE| |EX|FF|0|||
AR|BE|CA|D1| 5#6#3#;4#3#4;|ED|G||5|6|3
AR|BE|CA|D1| 5#6#3#;4#3#4;|ED|G||4|3|4

原脚本问题:
我之前的AWK脚本无法处理第5列仅含空格的情况,且存在输出顺序不稳定、未处理末尾#的问题:

BEGIN{FS=OFS="|"} {split($5,a,/;/); for (i in a) {if (a[i])
$9=a[i]; else next; gsub(/#/,"|",$9); print}}

解决方案:
修改后的AWK脚本如下,修复了上述问题:

BEGIN{FS=OFS="|"}
{
    # 清理第5列的首尾空格,方便判断是否为空
    col5 = $5
    gsub(/^[[:space:]]+|[[:space:]]+$/, "", col5)
    
    # 处理第5列为空的情况:直接追加三个空列
    if (col5 == "") {
        print $0 "|||"
        next
    }
    
    # 按分号拆分第5列,顺序遍历数组保证输出顺序和输入一致
    n = split(col5, a, /;/)
    for (i=1; i<=n; i++) {
        item = a[i]
        # 清理当前项的首尾空格
        gsub(/^[[:space:]]+|[[:space:]]+$/, "", item)
        # 跳过空项(比如分号结尾产生的空元素)
        if (item == "") continue
        # 去掉项末尾的#,避免拆分后多一个空列
        gsub(/#$/, "", item)
        # 将#替换为竖线,完成拆分
        gsub(/#/, "|", item)
        # 输出原行+拆分后的列
        print $0 "|" item
    }
}

脚本说明:

  • 空列处理:先清理第5列的首尾空格,判断为空时直接追加|||,满足需求。
  • 顺序遍历:用for (i=1; i<=n; i++)替代for (i in a),保证输出顺序和原第5列的分号顺序一致。
  • 末尾#处理:通过gsub(/#$/, "", item)去掉每个项末尾的#,避免拆分后多一个空列。
  • 空项过滤:跳过拆分后产生的空元素(比如原第5列以分号结尾的情况),避免无效输出。

测试验证:
运行上述脚本处理示例输入,将完全匹配期望输出。

内容的提问来源于stack exchange,提问作者Tiara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:35:20