免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: aqbssh
打印 上一主题 下一主题

[文本处理] 如何用SHELL排列元素? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2012-10-24 12:11 |只看该作者
  1. #!/bin/bash
  2. depth=5
  3. if [ $# -ne 1 ]
  4. then
  5.     echo "usage:`basename $0` max_num"
  6.     exit 1
  7. fi

  8. max="$1"

  9. declare -a arr

  10. gen()
  11. {
  12.     local shendu=$1
  13.     if ((shendu==depth))
  14.     then
  15.         echo "${arr[@]}"
  16.         return 0
  17.     fi

  18.     local from=$2
  19.     for i in `seq $from "$max"`
  20.     do
  21.         arr[$shendu]=$i
  22.         gen $((shendu+1)) $((i+1))
  23.     done
  24. }

  25. gen 0 1
复制代码
这样符合要求不?

论坛徽章:
3
天蝎座
日期:2013-11-11 10:18:392015年亚洲杯之沙特阿拉伯
日期:2015-04-06 15:51:08CU十四周年纪念徽章
日期:2017-01-07 22:56:29
12 [报告]
发表于 2012-10-24 12:21 |只看该作者
本帖最后由 aqbssh 于 2012-10-24 12:38 编辑

回复 11# qq312873977


    谢谢,是这个意思,如果要排列的元素在一个临时文件中,看来代码要有些改动才行,让我先想想吧,反正这也只是我乱想的
我原来是想做一个递归的调用,只是不知道怎么实现,谢谢!!


想起了 shell 水平综合测试的附加题3 想起了50楼的回答,慢慢混吧

论坛徽章:
3
天蝎座
日期:2013-11-11 10:18:392015年亚洲杯之沙特阿拉伯
日期:2015-04-06 15:51:08CU十四周年纪念徽章
日期:2017-01-07 22:56:29
13 [报告]
发表于 2012-10-25 18:14 |只看该作者
回复 11# qq312873977


    问一下,这个函数 if ((shendu==depth)) 时,就打印数组并 return 0 返回了,后面的代码是怎么执行的呢?
我改了下

#!/bin/bash
depth=3
if [ $# -ne 1 ]
then
    echo "usage:`basename $0` max_num"
    exit 1
fi

max="$1"

declare -a arr

gen()
{
    local shendu=$1
    if ((shendu==depth))
    then
#       echo "${arr[@]}"
        return 0
    fi

    local from=$2
    for i in `seq $from "$max"`
    do
        arr[$shendu]=$i
       echo "${arr[@]}"  aaaaaaa
       echo ${shendu}
        sleep 1
      gen $((shendu+1)) $((i+1))
    done
}

gen 0 1





depth=3  $1=4执行时,如下 :
[h@b ~]$ ./rrr.sh  4
1 aaaaaaa
0
1 2 aaaaaaa
1
1 2 3 aaaaaaa
2
1 2 4 aaaaaaa
2
1 3 4 aaaaaaa
1
1 3 4 aaaaaaa
2
1 4 4 aaaaaaa
1
2 4 4 aaaaaaa
0
2 3 4 aaaaaaa
1
2 3 4 aaaaaaa
2
2 4 4 aaaaaaa
1
3 4 4 aaaaaaa
0
3 4 4 aaaaaaa
1
4 4 4 aaaaaaa
0

调用这个函数的时候 ,gen $((shendu+1)) $((i+1))  深度  $(shendu)   不是一直在增加的吗?

论坛徽章:
0
14 [报告]
发表于 2012-10-25 18:31 |只看该作者
回复 13# aqbssh
注意shendu是个局部变量,子递归函数返回后,shendu会恢复为调用之前的值


   

论坛徽章:
3
天蝎座
日期:2013-11-11 10:18:392015年亚洲杯之沙特阿拉伯
日期:2015-04-06 15:51:08CU十四周年纪念徽章
日期:2017-01-07 22:56:29
15 [报告]
发表于 2012-11-13 19:11 |只看该作者
本帖最后由 aqbssh 于 2012-11-14 08:15 编辑

回复 11# qq312873977


   如果是在一个文件 中,终于摸索出了点头绪

#!/bin/bash
seq 1000  >tmp.txt
awk -v ORS="  " '{print $0}' tmp.txt  >tmpfile

awk  '{
for(a=1;a<=NF;a++){
        for(b=2;b<=NF;b++){
                for(c=3;c<=NF;c++){
for(d=4;d<=NF;d++){if(a<b&&b<c&&c<d)  print $a,$b,$c,$d  }
                                }
                }
        }
}' tmpfile


不知道这样实现有没有遗漏或者重复?只是,这是循环,而不是递归。
用这个办法如果更改下文件的分隔符,就能处理其它形式的文本排列了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP