我真的是一个关于bash编程的新手,我需要执行一个排列,我使用这个论坛中的一个帖子做了如下Generating permutations using bash。
#!/bin/bash
list=`echo {1..12}`
for c1 in $list
do
for c2 in $list
do
for c3 in $list
do
echo $c1-$c2-$c3
done
done
done
输出
1-1-1
1-1-2
1-1-3 ...
但我不想在行(1-1-1)中重复一个数字。 意思是如果数字1在第一个位置,我不希望它在第二个也不是第三个。像这样
1-2-3
1-2-4
1-2-5
...
任何人都可以帮助我吗?任何提示都是受欢迎的。
答案 0 :(得分:1)
我认为您需要将回声线更改为:
[ $c1 -ne $c2 -a $c1 -ne $c3 -a $c2 -ne $c3 ] && echo $c1-$c2-$c3
答案 1 :(得分:0)
问题顶部的链接已经包含了关于如何在bash中进行排列的一个很好的答案。但我认为这不是您正在寻找的答案所以我建议您使用以下脚本:
#!/bin/bash
list=`echo {1..12}`
for c1 in $list
do
for c2 in $list
do
if [ "$c1" != "$c2" ]; then
for c3 in $list
do
if [ "$c1" != "$c3" ]; then
echo $c1-$c2-$c3
fi
done
fi
done
done
答案 2 :(得分:0)
这是否符合您的要求?
#!/bin/bash
list=$(echo {1..12})
for c1 in $list
do
for c2 in $list
do
if (( c2 != c1 ))
then
for c3 in $list
do
if (( c3 != c2 && c3 != c1))
then
echo $c1-$c2-$c3
fi
done
fi
done
done
部分输出:
1-2-3
1-2-4
1-2-5
1-2-6
1-2-7
1-2-8
1-2-9
1-2-10
1-2-11
1-2-12
1-3-2
1-3-4
...
12-10-8
12-10-9
12-10-11
12-11-1
12-11-2
12-11-3
12-11-4
12-11-5
12-11-6
12-11-7
12-11-8
12-11-9
12-11-10
答案 3 :(得分:0)
问题中的解决方案提供了笛卡尔积。 以下函数生成一组值的排列。
declare -a set=( 1 2 3 ) # set to permute
declare -i n=${#set[@]}
permute ()
{
declare -i k=$1
declare -i i
declare -i save
if [ $k -lt $((n-1)) ] ; then
for (( i=k; i<n; i+=1 )); do
save=${set[k]} # exchange elements
set[k]=${set[i]}
set[i]=$save
permute $((k+1)) # recurse
save=${set[k]} # exchange elements
set[k]=${set[i]}
set[i]=$save
done
else
(IFS='-'; echo -e "${set[*]}")
fi
} # ---------- end of function permute ----------
permute 0
输出:
1-2-3
1-3-2
2-1-3
2-3-1
3-2-1
3-1-2
答案 4 :(得分:0)
我遇到了类似的问题,但是有文字字符,所以,以防它可能会有所帮助:
for i in {a..z} ; do for b in {a..z} ; do [[ ! "$i" == "$b" ]] && echo -e "$i $b" | xargs -n 1 | sort | xargs ; done ; done | sort -u
它将使a到z置换a到z,不仅不会重复字符“aa”,而且还没有诸如“ab”和“ba”之类的冗余,回显“ab”,这要归功于“内联排序” “元素(xargs | sort | xargs)后跟最后的”sort -u“(或”uniq“)。