如何用sed将数组分成多行

时间:2018-01-18 05:45:06

标签: shell sed

我有这样的 txt 数据:

A B [C,D,E] [F,G]

想要将结果输出为:

A B C F \n
A B C G \n
A B D F \n
A B D G \n
A B E F \n
A B E G \n

如何使用sed命令执行此操作?

3 个答案:

答案 0 :(得分:5)

如果您想使用sedawk “按摩”您的字符串:

"A B" ::: C D E ::: F G

您可以使用 GNU Parallel 为您进行排列:

parallel -k echo ::: "A B" ::: C D E ::: F G

<强>输出

A B C F
A B C G
A B D F
A B D G
A B E F
A B E G

没有人说答案必须完整,他们可能只是有帮助或部分。也许你或其他人想要添加必要的“按摩”

答案 1 :(得分:2)

如果您接受除sed之外的其他解决方案,则可以使用单行awk解决方案:

echo A B [C,D,E] [F,G] | awk '{a=$1; b=$2; tmp1=$3; tmp2=$4}END{split(substr(tmp1,2,length(tmp1)-2),arr1,","); split(substr(tmp2,2,length(tmp2)-2),arr2,","); for(i in arr1){for(j in arr2){print a" "b" "arr1[i]" "arr2[j]" \\n"}}}'

<强>输出:

A B C F \n
A B C G \n
A B D F \n
A B D G \n
A B E F \n
A B E G \n

如果您不需要在每行末尾显示" \\n",则可以删除\n

答案 2 :(得分:2)

假设 inputfile 包含:

A B [C,D,E] [F,G]
A B C [D,E] [M,N]

使用sed将这些解析为parallel喜欢的表单(从Mark Setchell's answer借来的方法),一次一行:

sed 's/ \[\|\] \[/ ::: /g;y/,]/  /;s/^/"/;s/ :/" :/;s/ $//' inputfile | 
xargs -L 1 parallel -k echo :::

输出:

A B C F
A B C G
A B D F
A B D G
A B E F
A B E G
A B C D M
A B C D N
A B C E M
A B C E N

注意:

  • sed代码并非最佳。
  • man parallel中示例的略读提示可能会使用额外的xargs魔法替换parallel