Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用bash生成人员/字符串的置换_Bash_Permutation - Fatal编程技术网

使用bash生成人员/字符串的置换

使用bash生成人员/字符串的置换,bash,permutation,Bash,Permutation,我有一个有名字的文件。每一行代表人与人之间的联系。 但一行中也可能只有一个名字 Donald Duck;Daisy Duck;Della Duck; Fethry Duck;Dudly D. Duck;Donald Duck; Della Duck;Dudly D. Duck;Moby Duck; Dugan Duck;Donald Duck;Dimwitty Duck;Whitewater Duck; Lonesome Duck; 我想把这些行排列一下。结果应该是这样的 Donald Duc

我有一个有名字的文件。每一行代表人与人之间的联系。 但一行中也可能只有一个名字

Donald Duck;Daisy Duck;Della Duck;
Fethry Duck;Dudly D. Duck;Donald Duck;
Della Duck;Dudly D. Duck;Moby Duck;
Dugan Duck;Donald Duck;Dimwitty Duck;Whitewater Duck;
Lonesome Duck;
我想把这些行排列一下。结果应该是这样的

Donald Duck;Daisy Duck
Donald Duck;Della Duck
Daisy Duck;Della Duck
Fethry Duck;Dudly D. Duck
Fethry Duck;Donald Duck
Dudly D. Duck;Donald Duck
Della Duck;Dudly D. Duck
Della Duck;Moby Duck
Dudly D. Duck;Moby Duck
Dugan Duck;Donald Duck
Dugan Duck;Dimwitty Duck
Dugan Duck;Whitewater Duck
Donald Duck;Dimwitty Duck
Donald Duck;Whitewater Duck
Dimwitty Duck;Whitewater Duck
Lonesome Duck;

所提供的解决方案不考虑单词,但不考虑单个字符。

看来,您需要在每行中组合两个名称。用于此的bash脚本可以是这样的:

#!/bin/bash

while IFS=\; read -r -a names; do
    if ((${#names[@]} == 1)); then # if we have only one name, just echo it
        echo "${names[0]}"
    else
        for ((i = 0; i < ${#names[@]} - 1; ++i)); do
            for ((j = i + 1; j < ${#names[@]}; ++j)); do
                echo "${names[i]};${names[j]}"
            done
        done
    fi
done < names.txt
#/bin/bash
而IFS=\;read-r-a名称;做
如果(${#names[@]}==1);那么#如果我们只有一个名字,就呼应一下
回显“${names[0]}”
其他的
对于((i=0;i<${名称[@]}-1;++i));做
对于((j=i+1;j<${名称[@]};++j));做
echo“${names[i]};${names[j]}”
完成
完成
fi
done
太棒了!对不起,我忘了写一句,也有可能一行中只有一个名字
Duck。这仍然应该按原样打印(更新了我的问题)。这正是我的答案!你先到的+1@LukasCB编辑答案我建议
i
循环的条件可以是
i<${{#names[@]}-1
——目前的情况是,当
i
是最后一个索引时,
j
循环的迭代次数为零。@glennjackman这是一个微观优化,但是你的建议很好,我也遵守了。是否应该更新期望的输出以反映寂寞的鸭子?