Chinaunix

标题: 如何一一对应 [打印本页]

作者: addictlinux    时间: 2010-08-02 17:51
标题: 如何一一对应
有文件如下:
  1. 01 08 16 17 25 30
  2. 05 21 28 29 30 31
  3. 01 08 12 13 24 27
  4. 02 10 14 18 20 30
  5. 02 20 21 22 23 31
  6. 01 08 13 14 27 31
  7. 02 03 09 24 26 27
  8. 08 10 13 14 16 23
复制代码
现在想将其一一对应
01 02 03 04 05 06 07 08 09 10 11  | 12 13 14 15 16 17 18 19 20 21 22  | 23 24 25 26 27 28 29 30 31 32 33
01                             08                                       16  17                                       25                     30
......

如何实现?
我的疑惑是,printf("%[num]s",$i) // [num] 可以为数字变量么? hehe
作者: ywlscpl    时间: 2010-08-02 17:54
有意思,是双色球吧
作者: addictlinux    时间: 2010-08-02 17:58
嘘,小点声!前天同事她老公隔壁家的小舅子,差一个红球就500W了,搞的我心痒痒的,琢磨琢磨看。
作者: 俺小时候可帅了    时间: 2010-08-02 18:02
同事她老公隔壁家的小舅子,乖乖,这关系整的,
作者: bbgg1983    时间: 2010-08-02 18:09
没看懂,求解释。
作者: ywlscpl    时间: 2010-08-02 18:44
  1. awk 'BEGIN{for (i=1;i<=33;i++) {printf "%02d ",i;if (!(i%11)&&i<33) printf "| "}print ""}{for (i=1;i<=NF;i++) {if (!T1&&$i>11) {printf "  ";T1=1}if (T1&&!T2&&$i>22) {printf "  ";T2=1}for (j=1;j<$i-v;j++) printf "   ";printf $i" ";v=$i}print "";v=0;T1=T2=0}' file
复制代码

作者: yuloveban    时间: 2010-08-02 19:05
题目没有看明白~
作者: ywlscpl    时间: 2010-08-02 19:09
回复 5# bbgg1983


双色球综合分布图
http://map2.zhcw.com/tbpd/ssq/ss ... sqZongHeFengBuTuAsc
这下应该懂了吧   
作者: miniqq    时间: 2010-08-02 20:39
有意思,不过也很简单啊.


awk '{
for(i=1; i<=33; i++) {
        if($1 == i)
                arr[i] = i
        else if ($2 == i)
                arr[i] = i
        else if ($3 == i)
                arr[i] = i
        else if ($4 == i)
                arr[i] = i
        else if ($5 == i)
                arr[i] = i
        else if ($6 == i)
                arr[i] = i
        else
                arr[i] = "  "
}
for (i=1; i<= 33; i++) {
        if(arr[i] < 10)
                printf ("%02s ", arr[i])
        else
                printf ("%s ", arr[i])
}
printf ("\n")
}'  < file
作者: bbgg1983    时间: 2010-08-02 20:47
回复 6# ywlscpl


    哇,这么先进,我经常见隔壁六十多的大爷弄了一大张纸,每期都记录,N多的点,你这个先进多了,我一定要告诉他!顺便鼓动他学shell
作者: addictlinux    时间: 2010-08-02 21:13
能否告诉我arr = "  "(两个空格)?
为什么不是一个空格呢? arr = " " //当然结果肯定不一样.
测试结果:有一个空格情况
  1. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
  2. 0  0  0  0  05 06 0  0  0  0  0  0  0  0  15 0  0  0  0  0  0  0  23 0  0  0  27 0  0  30 0  0  0  
  3. 01 0  0  0  0  0  0  08 0  0  0  0  0  0  0  16 17 0  0  0  0  0  0  0  25 0  0  0  0  30 0  0  0  
  4. 0  0  0  0  05 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  21 0  0  0  0  0  0  28 29 30 31 0  0  
  5. 01 0  0  0  0  0  0  08 0  0  0  12 13 0  0  0  0  0  0  0  0  0  0  24 0  0  27 0  0  0  0  0  0  
  6. 0  02 0  0  0  0  0  0  0  10 0  0  0  14 0  0  0  18 0  20 0  0  0  0  0  0  0  0  0  30 0  0  0  
  7. 0  02 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  20 21 22 23 0  0  0  0  0  0  0  31 0  0  
  8. 01 0  0  0  0  0  0  08 0  0  0  0  13 14 0  0  0  0  0  0  0  0  0  0  0  0  27 0  0  0  31 0  0  
  9. 0  02 03 0  0  0  0  0  09 0  0  0  0  0  0  0  0  0  0  0  0  0  0  24 0  26 27 0  0  0  0  0  0
复制代码
如果是两个空格,结果为我所需要的结果.
作者: addictlinux    时间: 2010-08-02 21:15
arr="  " 为什么是两个空格?
为什么arr=" " 不是一个空格呢?
一个空格的测试结果:
  1. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
  2. 0  0  0  0  05 06 0  0  0  0  0  0  0  0  15 0  0  0  0  0  0  0  23 0  0  0  27 0  0  30 0  0  0  
  3. 01 0  0  0  0  0  0  08 0  0  0  0  0  0  0  16 17 0  0  0  0  0  0  0  25 0  0  0  0  30 0  0  0  
  4. 0  0  0  0  05 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  21 0  0  0  0  0  0  28 29 30 31 0  0  
  5. 01 0  0  0  0  0  0  08 0  0  0  12 13 0  0  0  0  0  0  0  0  0  0  24 0  0  27 0  0  0  0  0  0  
  6. 0  02 0  0  0  0  0  0  0  10 0  0  0  14 0  0  0  18 0  20 0  0  0  0  0  0  0  0  0  30 0  0  0
复制代码

作者: addictlinux    时间: 2010-08-02 21:18
回复 6# ywlscpl


    好,mark一下,明天慢慢看.谢谢.
作者: miniqq    时间: 2010-08-02 21:35
回复 6# ywlscpl


    如果每行的数据不是 从小到大排列 就会出错.
作者: miniqq    时间: 2010-08-02 21:37
本帖最后由 miniqq 于 2010-08-02 21:52 编辑
arr="  " 为什么是两个空格?
为什么arr=" " 不是一个空格呢?
一个空格的测试结果:
addictlinux 发表于 2010-08-02 21:15



    一个 空格 (<10) 不足  "02s" , 所以打出了个 0 补上.


你可以改改打印方式.
作者: xborant    时间: 2010-08-02 22:03
  1. #!/usr/bin/awk -f

  2. function println(arr)
  3. {
  4.         for(i=1;i<=33;i++)
  5.         {
  6.                 if(i in arr) printf("%02d",i)
  7.                 else printf("  ")
  8.                 if(i%11==0 && i<33) printf("|")
  9.         }
  10.         print ""
  11. }

  12. BEGIN {
  13.         for(i=1;i<=33;i++) a[i]=1
  14.         println(a)
  15. }

  16. {
  17.         delete a
  18.         for(i=1;i<=NF;i++) {a[$i+0]=1}
  19.         println(a)
  20. }
复制代码

作者: miniqq    时间: 2010-08-02 22:16
xborant 发表于 2010-08-02 22:03



    原来 awk有这个写法  if ( i in arr)
呵呵,我写多了.
作者: blackold    时间: 2010-08-03 08:54
回复 9# miniqq


    思路很好,就是写得复杂了些。
作者: wild_li    时间: 2010-08-03 09:04
这应用,,发现这是shell应用最牛B的一次了
作者: expert1    时间: 2010-08-03 09:34
awk 'BEGIN{for (i=1;i<=33;i++) {if (i<=16) blue[i]=i;red[i]=i}srand();for (j=1;j<=1000;j++) {if (j==1) {print "blue: "blue[int(rand()*16)+1];continue}v=int(rand()*33)+1;if (!a[v]) {n++;a[v]=1;b[n]=v;if (n==6) break}}for (k=1;k<=6;k++) print "red: "red[b[k]]}'
作者: xborant    时间: 2010-08-03 09:53
回复 17# miniqq
都是一个意思,写法不一样而已
作者: blackold    时间: 2010-08-03 10:03
  1. awk 'BEGIN{for(i=01;i<34;i++) t=t?t" "sprintf("%02s",i):sprintf("%02s",i);print t}{delete a;for(i=1;i<=NF;i++)a[$i];for(i=1;i<34;i++){j=sprintf("%02s",i);if(j in a) $i=j"";else $i="  "}print }' urfile
复制代码

作者: snriyt    时间: 2010-08-03 11:27
数组,hash




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2