Shell AWK功率集的实现
在shell中提供了一个实现,下面是我对它的看法:Shell AWK功率集的实现,shell,unix,awk,powerset,Shell,Unix,Awk,Powerset,在shell中提供了一个实现,下面是我对它的看法: pa() { if [ "$#" = 0 ] then echo else ( shift pa "$@" ) | while read qu do printf '%s %s\n%s\n' "$1" "$qu" "$qu" done fi } pa x y z 我认为有趣的是,上述页面的作者发表了以下评论: 没有好的AWK解决方案。欢迎您给我发电子邮件: 这不能在AWK中完成,还是shel
pa() {
if [ "$#" = 0 ]
then echo
else (
shift
pa "$@"
) | while read qu
do printf '%s %s\n%s\n' "$1" "$qu" "$qu"
done
fi
}
pa x y z
我认为有趣的是,上述页面的作者发表了以下评论:
没有好的AWK解决方案。欢迎您给我发电子邮件:
这不能在AWK中完成,还是shell在这里做得更好?下面是一个改编自以下内容的解决方案:
这里是另一种AWK方法:
echo a b c | awk '{for(i=0;i<2^NF;i++) {
for(j=0;j<NF;j++)
if(and(i,(2^j))) printf "%s ",$(j+1)
print ""}}'
a
b
a b
c
a c
b c
a b c
echo a b c | awk'{for(i=0;i在GNU awk中(由于和,lshift
和拆分的方式:)
…结果与@karakfa的解决方案基本相同,甚至在变量名上也是如此。我需要新的朋友和变量。@StevenPenny:更准确地说,使用“
作为split()
的第三个(fs)用于将字符串拆分为单个字符的参数不符合POSIX,但GNU Awk、BSD Awk和Mawk都支持它。您应该将此代码放在下面的代码Golf power set实现中:…除非您可以使其更短…:d感谢您的建议。我在那里添加了此参数。您可以将I=0
初始化从e第一个循环。优雅简洁。值得注意的是,除了第一个输出行外,每个输出行都有一个尾随空格。GNU Awk是唯一支持和()
的主要Awk实现。
echo x y z | power-set.awk
echo a b c | awk '{for(i=0;i<2^NF;i++) {
for(j=0;j<NF;j++)
if(and(i,(2^j))) printf "%s ",$(j+1)
print ""}}'
a
b
a b
c
a c
b c
a b c
$ cat program.awk
BEGIN {
n=split(s,a,"")
for(i=1;i<2^n;i++) {
for(j=1;j<=n;j++)
if(and(lshift(1,(j-1)),i))
printf "%s", a[j]
print ""
}
}
$ awk -v s="abc" -f program.awk
a
b
ab
c
ac
bc
abc