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

如何用sed或awk实现保留父字段的Unpivot行转置操作?

拆分带分隔符字段并保留前置字段的Linux命令实现

问题描述

源数据格式示例:

Value11 | Value12 | ValueA,ValueB,ValueC
Value21 | Value22 | ValueA2

期望输出:

Value11 | Value12 | ValueA
Value11 | Value12 | ValueB
Value11 | Value12 | ValueC
Value21 | Value22 | ValueA2

需求为:保留前两个字段的同时,将第三个字段中用逗号分隔的内容拆分为独立行,每行对应一条完整记录。若仅需提取拆分后的第三个字段,可使用cut -f3 -d "|" | sed -e 's/,/\n/g',但本次需保留前置字段。

最优解决方案:awk实现

awk是处理这类结构化文本场景的首选工具,逻辑清晰且高效:

awk -F'|' '{split($3, arr, ","); for (i in arr) print $1 " | " $2 " | " arr[i]}' input.txt

代码说明

  • -F'|':指定竖线|作为字段分隔符
  • split($3, arr, ","):将第三个字段按逗号拆分,存入数组arr
  • for (i in arr):遍历数组中的每个拆分后元素
  • print $1 " | " $2 " | " arr[i]:拼接前两个字段与数组元素,输出符合要求的记录

如果源数据中竖线前后存在空格,可优化分隔符规则自动去除空格:

awk -F' *\\| *' '{split($3, arr, ","); for (i in arr) print $1 " | " $2 " | " arr[i]}' input.txt

这里-F' *\\| *'表示将「前后包含任意空格的竖线」作为分隔符,自动剔除字段前后的空格。

补充方案:sed实现(仅供参考)

若偏好sed工具,可使用如下命令(逻辑较awk复杂,适合简单场景):

sed -E 's/^([^|]+ \| [^|]+ \| )([^,]+),/\1\2\n\1/g' input.txt | sed -E '/,$/d'

该命令通过多次替换拆分字段,最后清理末尾残留的逗号行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 18:04:53