我有这样的 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
命令执行此操作?
答案 0 :(得分:5)
如果您想使用sed
或awk
“按摩”您的字符串:
"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
。