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

如何在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'"

代码解释

  1. 行数据读取:将输入文本按行读入数组lines,方便后续逐行处理。
  2. 递归核心逻辑:
    • 终止条件:处理第一行时,直接返回该行的所有元素作为初始组合。
    • 递归过程:对当前行,先递归获取上一行的所有组合,再将当前行的每个元素与这些组合逐一拼接,生成新的组合。
  3. 结果收集:从最后一行触发递归,最终收集所有笛卡尔积组合并输出。

对你现有尝试的补充

你已经成功提取了每行元素并存入关联数组,但缺少笛卡尔积的组合逻辑。递归的优势在于不需要预先知道行数和每行元素数量,能动态适配任意规模的输入,自动完成全元素组合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:10:19