免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2320 | 回复: 7
打印 上一主题 下一主题

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

论坛徽章:
3
天蝎座
日期:2013-11-11 10:18:392015年亚洲杯之沙特阿拉伯
日期:2015-04-06 15:51:08CU十四周年纪念徽章
日期:2017-01-07 22:56:29
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-24 09:14 |显示全部楼层 |倒序浏览
本帖最后由 aqbssh 于 2012-10-24 11:14 编辑

例如 有从1 到10000之间所有连续的自然数,每 5个数排成一列、、

1 2 3 4 5
1 2 3 4 6
1 2 3 4 7
1 2 3 4 8
1 2 3 4 9
1 2 3 4 10
。。。。。
1 2 3 5 6
1 2 3 5 7
............
9996  9997  9998 9999  10000

应该如何实现?如果这个数列再大很多的话,(比如从1 到一千万)是不 是某些方法就不适用了?

论坛徽章:
3
天蝎座
日期:2013-11-11 10:18:392015年亚洲杯之沙特阿拉伯
日期:2015-04-06 15:51:08CU十四周年纪念徽章
日期:2017-01-07 22:56:29
2 [报告]
发表于 2012-10-24 11:10 |显示全部楼层
回复 2# yestreenstars


    不是的,是所有不重复的排列

论坛徽章:
3
天蝎座
日期:2013-11-11 10:18:392015年亚洲杯之沙特阿拉伯
日期:2015-04-06 15:51:08CU十四周年纪念徽章
日期:2017-01-07 22:56:29
3 [报告]
发表于 2012-10-24 11:31 |显示全部楼层
回复 3# blackold


#!/bin/bash
seq 1000  >tmp.txt
awk -v ORS="  " '{print $0}' tmp.txt  >tmpfile
awk   '{for(i=1;i<=1000;i++)print $1,$i}'  tmpfile

我要的是类似这种排列,这只是两两排列。还有
awk   '{for(i=2;i<=1000;i++)print $2,$i}'  tmpfile
awk   '{for(i=3;i<=1000;i++)print $3,$i}'  tmpfile
。。。。。。

论坛徽章:
3
天蝎座
日期:2013-11-11 10:18:392015年亚洲杯之沙特阿拉伯
日期:2015-04-06 15:51:08CU十四周年纪念徽章
日期:2017-01-07 22:56:29
4 [报告]
发表于 2012-10-24 11:45 |显示全部楼层
本帖最后由 aqbssh 于 2012-10-24 11:47 编辑
blackold 发表于 2012-10-24 11:40
回复 6# aqbssh

所有的元素,每5个不重复的组合到一行,要列出所有可能 的组合。谢谢!
没有数学功底就 差得多,表述不清自己的意思。

论坛徽章:
3
天蝎座
日期:2013-11-11 10:18:392015年亚洲杯之沙特阿拉伯
日期:2015-04-06 15:51:08CU十四周年纪念徽章
日期:2017-01-07 22:56:29
5 [报告]
发表于 2012-10-24 12:02 |显示全部楼层
回复 9# blackold


   是呀,所以我才说要是元素多了,要用临时文件,而且要考虑到能实现

论坛徽章:
3
天蝎座
日期:2013-11-11 10:18:392015年亚洲杯之沙特阿拉伯
日期:2015-04-06 15:51:08CU十四周年纪念徽章
日期:2017-01-07 22:56:29
6 [报告]
发表于 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
7 [报告]
发表于 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)   不是一直在增加的吗?

论坛徽章:
3
天蝎座
日期:2013-11-11 10:18:392015年亚洲杯之沙特阿拉伯
日期:2015-04-06 15:51:08CU十四周年纪念徽章
日期:2017-01-07 22:56:29
8 [报告]
发表于 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