文本列拆分需求: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
相关产品推荐
相关产品推荐

