如何在Bash中实现多行字符串数组的笛卡尔积组合
递归实现多行元素的笛卡尔积组合
需求说明
给定如下格式的文本:
TEXT='1,2 a,b,c XX,YY'
需要生成所有行元素的笛卡尔积,输出如下:
OUT='1,a,XX 1,a,YY 1,b,XX 1,b,YY 1,c,XX 1,c,YY 2,a,XX 2,a,YY 2,b,XX 2,b,YY 2,c,XX 2,c,YY'
递归实现代码
TEXT='1,2 a,b,c XX,YY' # 递归函数:生成笛卡尔积 cartesian() { local current_line=$1 # 读取当前行的元素数组 IFS=',' read -ra elements <<< "${lines[$current_line]}" if (( current_line == 0 )); then # 第一行,直接返回每个元素作为初始组合 printf "%s\n" "${elements[@]}" return fi # 递归处理上一行的组合 local prev=$(cartesian $((current_line - 1))) # 将当前行每个元素与上一行的每个组合拼接 for p in $prev; do for e in "${elements[@]}"; do printf "%s,%s\n" "$p" "$e" done done } # 先把TEXT按行存入数组lines declare -a lines while read -r line; do lines+=("$line") done <<< "$TEXT" # 从最后一行开始递归处理 OUT=$(cartesian $(( ${#lines[@]} - 1 ))) # 输出结果 echo "OUT='$OUT'"
代码解释
- 行数据读取:将输入文本按行读入数组
lines,方便后续逐行处理。 - 递归核心逻辑:
- 终止条件:处理第一行时,直接返回该行的所有元素作为初始组合。
- 递归过程:对当前行,先递归获取上一行的所有组合,再将当前行的每个元素与这些组合逐一拼接,生成新的组合。
- 结果收集:从最后一行触发递归,最终收集所有笛卡尔积组合并输出。
对你现有尝试的补充
你已经成功提取了每行元素并存入关联数组,但缺少笛卡尔积的组合逻辑。递归的优势在于不需要预先知道行数和每行元素数量,能动态适配任意规模的输入,自动完成全元素组合。
内容的提问来源于stack exchange,提问作者Roman Dobra
相关产品推荐
相关产品推荐

