使用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这是一个微观优化,但是你的建议很好,我也遵守了。是否应该更新期望的输出以反映寂寞的鸭子?