如何用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, ","):将第三个字段按逗号拆分,存入数组arrfor (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
相关产品推荐
相关产品推荐

