ChinaUnix首页 > 精华文章 > Shell > 正文

[原创] 送给Shell版兄弟姐妹们的节日礼物


http://www.chinaunix.net 作者:dbcat  发表于:2007-04-09 10:24:45
发表评论】 【查看原文】 【Shell讨论区】【关闭



                           送给Shell版兄弟姐妹们的节日礼物




有好一段时间不来了,怪想大家的。
眼看快到十月一了,写了两个awk程序作为礼物送给shell版的兄弟姐妹们,祝大家节日愉快!

注:若转载请保持程序的完整,谢谢!

程序一:
彩色显示文件程序,每个字符的颜色都不一样,随机变化,让你看花眼睛^_^:

程序代码:

#! /usr/bin/awk
#  Write by dbcat
#  EMail:deeperbluecat@Gmail.com
#  run : awk -f ColorCat.awk YourFile

BEGIN{
        srand()

}

{
        split($0,Myth,"")
        ColorPrint(Myth,length($0))
}


function ColorPrint(Myth,xlen)
 {
   for(i=1;i<=xlen;i++)
    {
       Color="\033[1;"int(31+7*rand())
       printf "%s;3m%s\033[0m",Color,Myth
    }
    printf "\n"
 }



程序二:
彩色作图程序,有点像Gnuplot,可以作出圆形,正弦图,抛物线等等。

例如:
   圆:      awk 'BEGIN{while(k<10){print sin(k),cos(k);k=k+0.01}}'   |  awk -f ColorPlot.awk
   正弦线:   awk 'BEGIN{while(k<10){print sin(k),k;k=k+0.01}}'        |  awk -f ColorPlot.awk
   抛物线:  awk 'BEGIN{k=-10;while(k<10){print k^2,k;k=k+0.01}}'     |  awk -f ColorPlot.awk
   直线:    paste <(seq 1 0.01 10)  <(seq 1 0.01 10)                 |  awk -f ColorPlot.awk


如果你有想象力的话还可以作出很多意想不到的图形,比如:

   圆盘:    awk 'BEGIN{while(k<100){print sin(k),rand()*cos(k);k=k+0.01}}' |awk -f ColorPlot.awk
   花圈:    awk 'BEGIN{srand()
                        while(k++<20000){
                           x=2-3*rand()
                           y=2-4*rand()
                           if(x^2+y^2>0.6&&x^2+y^2<1||x^2+y^2<0.3&&x^2+y^2>0.1)
                              print x,y
                           }
                       }'       | awk -f ColorPlot.awk

   菱圈:    awk 'BEGIN{srand()
                        while(k++<20000){
                           x=1-2*rand()
                           y=1-2*rand()
                           if(x+y<=1&&x-y<=1&&-x+y<=1&&-x-y<=1&&x^2+y^2>=1/2)
                              print x,y
                           }
                       }'       | awk -f ColorPlot.awk




程序代码:

#! /usr/bin/awk
# GAWK彩色作图程序
# 作者: dbcat
# Email: deeperbluecat@Gmail.Com
# 日期: 2006-9-25
# 测试环境: Gawk 3.1.4, bash 3.00.16(1), SUSE 9.3
# 运行方法: awk 'BEGIN{while(k<10){print sin(k),cos(k);k=k+0.01}}' >datafile
#           awk -f ColorPlot.awk datafile

BEGIN{
        srand()
        xlen=35
        ylen=35
        InitGraph(Myth,xlen,ylen)

}


{
        X_Max=X_Max>$1?X_Max:$1
        X_Min=X_Min<$1?X_Min:$1
        Y_Max=Y_Max>$2?Y_Max:$2
        Y_Min=Y_Min<$2?Y_Min:$2
        X_Label[NR]=$1
        Y_Label[NR]=$2

}


END{

        CreateGraph(Myth,NR)
        PrintGraph(Myth)

}

function InitGraph(Myth,xlen,ylen,i,j)
 {
   for(i=1;i<=xlen;i++)
     for(j=1;j<=ylen;j++)
        Myth[i,j]=" "
 }


function CreateGraph(Myth,Len,i)
 {

       for(i=1;i<=Len;i++)
          {
           X_Label=int((X_Label-X_Min)/(X_Max-X_Min)*(xlen-1) + 1)
           Y_Label=int((Y_Label-Y_Min)/(Y_Max-Y_Min)*(ylen-1) + 1)
           Myth[X_Label,Y_Label]=int(40+60*rand())
          }

 }


function PrintGraph(Myth,i,j)
 {
   for(i=1;i<=xlen;i++)
    {
      for(j=1;j<=ylen;j++)
         {
          color="\033[1;"int(31+7*rand())
          printf " %s;1m%c\033[0m",color,Myth[i,j]
         }
      printf "\n"
    }
 }




 寂寞烈火 回复于:2006-09-24 22:57:28

谢谢~dbcatMM的礼物~ ^_^ 也祝MM节日快乐!!!


 shitou9000 回复于:2006-09-24 23:00:26

收到


 insolaris 回复于:2006-09-24 23:30:12

为什么我输入这个命令 awk -f ColorCat.awk gift (gift is my awk filename)
就出现awk: fatal: can't open source file `ColorCat.awk' for reading (No such file or directory)
我不懂


 lovesaka 回复于:2006-09-25 03:16:13

怎么画心形呀?教教我:mrgreen:


 dbcat 回复于:2006-09-25 08:46:23

引用:原帖由 寂寞烈火 于 2006-9-24 22:57 发表
谢谢~dbcatMM的礼物~ ^_^ 也祝MM节日快乐!!! 






引用:
为什么我输入这个命令 awk -f ColorCat.awk gift (gift is my awk filename)
就出现awk: fatal: can't open source file `ColorCat.awk' for reading (No such file or directory)
我不懂



把那段AWK代码存为ColorCat.awk


 dbcat 回复于:2006-09-25 08:50:15

引用:原帖由 lovesaka 于 2006-9-25 03:16 发表
怎么画心形呀?教教我:mrgreen: 



你倒是很贪心嘛 
 
awk 'BEGIN{while(u<20){print sin(u)*sin(v),cos(u)*sin(v+u);v=v+0.01;u=u+0.01}}' | awk -f ColorPlot.awk


产生的就是一个心^_^



截图




 dbcat 回复于:2006-09-25 09:07:45

感谢waker版主加精^_^

再多提供大家几个有趣的图形:



爱心型
   awk 'BEGIN{while(u<20){print sin(u)*sin(v),rand()*cos(u)*sin(v+u);v=v+0.01;u=u+0.01}}'
绳结
   awk 'BEGIN{while(u<10){print sin(u+v)*sin(v),cos(u+v)*sin(v);v=v+0.01;u=u+0.01}}'
蝴蝶
   awk 'BEGIN{while(u<10){print sin(u+v)*sin(v),cos(u)*sin(v);v=v+0.01;u=u+0.01}}'
花瓣
  awk 'BEGIN{while(u<10){print sin(u+w)*cos(v)*sin(w+u),sin(u)*sin(v+u)*sin(w);v=v+0.01;u=u+0.01;w=w+0.01}}'
蝙蝠
  awk 'BEGIN{while(u<10){print sin(u+w)*cos(v+w)*sin(w+u),sin(u)*sin(v+u)*sin(w);v=v+0.01;u=u+0.01;w=w+0.01}}'
螺旋
  awk 'BEGIN{while(w<20){print sin(w)*w,cos(w)*w;w=w+0.01}}'



 技安 回复于:2006-09-25 09:11:04

-0.439662 -0.898163
-0.448621 -0.893722
-0.457536 -0.889191
-0.466405 -0.884571
-0.475227 -0.879863
-0.484002 -0.875067
-0.492728 -0.870183
-0.501405 -0.865213
-0.510032 -0.860155
-0.518608 -0.855012
-0.527132 -0.849783
-0.535603 -0.84447
-0.544021 -0.839072


 dbcat 回复于:2006-09-25 09:22:47

引用:原帖由 技安 于 2006-9-25 09:11 发表
-0.439662 -0.898163
-0.448621 -0.893722
-0.457536 -0.889191
-0.466405 -0.884571
-0.475227 -0.879863
-0.484002 -0.875067
-0.492728 -0.870183
-0.501405 -0.865213
-0.510032 -0.860155
-0.51860 ... 





这个画图程序的运行是这样的:
先产生预处理数据,如你上面给出的。主程序再利用这些数据进行描点画图。
我8楼的代码产生的是预处理数据,你需要用ColorPlot.awk(即程序二)来处理一下。
例如蝴蝶形:
awk 'BEGIN{while(u<10){print sin(u+v)*sin(v),cos(u)*sin(v);v=v+0.01;u=u+0.01}}'  | awk -f ColorPlot.awk


 技安 回复于:2006-09-25 09:34:21

[aluns]~/shtmp>awk 'BEGIN{while(k<10){print sin(k),cos(k);k=k+0.01}}'   |  awk -f awk.awk  | head
0 1
0.00999983 0.99995
0.0199987 0.9998
0.0299955 0.99955
0.0399893 0.9992
0.0499792 0.99875
0.059964 0.998201
0.0699428 0.997551
0.0799147 0.996802
0.0898785 0.995953


 dbcat 回复于:2006-09-25 09:42:16

引用:原帖由 技安 于 2006-9-25 09:34 发表
[aluns]~/shtmp>awk 'BEGIN{while(k<10){print sin(k),cos(k);k=k+0.01}}'   |  awk -f awk.awk  | head
0 1
0.00999983 0.99995
0.0199987 0.9998
0.0299955 0.99955
0.0399893 0.9992
0.0499792 0. ... 





可能是awk 版本的问题吧,
我这里没有问题的^_^
我的环境: Gawk 3.1.4, bash 3.00.16(1)



附截图




 cyaln 回复于:2006-09-25 09:48:35

8C8C~~~~~~继续学习


 lovesaka 回复于:2006-09-25 10:42:38

引用:原帖由 dbcat 于 2006-9-25 08:50 发表


你倒是很贪心嘛 
 
awk 'BEGIN{while(u<20){print sin(u)*sin(v),cos(u)*sin(v+u);v=v+0.01;u=u+0.01}}' | awk -f ColorPlo ... 



偶对你的仰慕就如同涛涛江水.....(怕写不下己略几万字)


 dbcat 回复于:2006-09-25 11:27:47

还有两个很漂亮的图形:


花蕊

  awk 'BEGIN{while(u<10){print sin(u)*cos(v+u)*sin(u+v),cos(v+u)*cos(u)*sin(v+u);v=v+0.01;u=u+0.01}}' | awk -f ColorPlot.awk
剪刀
  awk 'BEGIN{while(u<10){print sin(u+v)*cos(v+u)*sin(u+v),cos(v+u)*cos(u)*sin(v+u);v=v+0.01;u=u+0.01}}'| awk -f ColorPlot.awk




截图




 寂寞烈火 回复于:2006-09-25 13:56:33

终于明白了,这就是叫随心所欲的吧`


 mike_chen 回复于:2006-09-25 16:41:25

就是一个顶!


 boyhyc 回复于:2006-09-25 16:42:53

楼主真是弓虽!
努力学习ING


 r2007 回复于:2006-09-25 21:31:53

佩服!dbMM最近少见啊,希望常来。


 wayy2008 回复于:2006-09-25 21:33:12

高手啊,学习中。。。。。。


 katu 回复于:2006-09-26 12:43:50

奇怪了 我要改代码才能运行
难道其他人直接可以运行么?


 awk就是awp加ak 回复于:2006-09-26 16:44:56

可以,就是没颜色。我telnet的
谢谢dbcat!前天是什么节日?


 Ksharp 回复于:2006-09-26 17:10:07

大牛啊,收我为徒吧~~~


 poleon 回复于:2006-09-26 17:37:07

楼主是 姐姐阿 ? 
收藏一下 虽然不太懂 
慢慢研究 哈哈 这个好玩阿
以后可以为女朋友 送个心过去
这才是cs特色阿 哈哈
还有 我得认识 一下 美女 姐姐 @_@

只弄出来 三四个 
我那个 心是空心的 555
很喜欢阿 漂亮
学习ing

可以让朋友们 放松一下 喜欢

楼主姐姐 节日快乐 喽
还有 cu的 所有 兄弟姐妹们

[ 本帖最后由 poleon 于 2006-9-26 17:58 编辑 ]


 loesprite 回复于:2006-09-27 00:18:21

好帖得回,等下仔细看看~~~!!!
楼主以后要经常发点技术贴,不然俺们的技术都生疏了

[ 本帖最后由 loesprite 于 2006-9-27 08:14 编辑 ]


 飞灰橙 回复于:2006-09-27 10:29:20

真牛,
好有想象力啊
这些公式是怎么推导出来的啊?


 flowingtree 回复于:2006-09-27 10:57:53

收藏


 filwy 回复于:2006-09-27 11:26:44

佩服


 cq20081127 回复于:2006-09-27 11:56:33

看不懂看不懂,对于我这个初学者太深了~~最好解释下!!!


 rain_forest 回复于:2006-09-27 12:54:44

很崇拜啊

以后:

1)不敢说自己会AWK
2)要相信Gril Programmer也可以写出Great的程序


 happy2008163 回复于:2006-09-27 13:23:28

嘎嘎


 xchen301 回复于:2006-09-27 16:30:03

哇哇哇,very nice~~~

dbcat MM很可爱的说~


 fox_fox 回复于:2006-09-27 16:48:06

佩服,佩服


 rocklv 回复于:2006-09-27 17:24:11

漂亮极了:):)


 sunkez 回复于:2006-09-27 17:31:56

这个女孩,写程序这么厉害呀,羡慕!


 ZealeS 回复于:2006-09-27 17:42:58

强大得一塌糊涂。。^_^


 huanghaojie 回复于:2006-09-27 18:01:52

只能向往我们的LZ MM,高不可攀呀。


 lrz 回复于:2006-09-27 21:28:46

引用:原帖由 katu 于 2006-9-26 12:43 发表
奇怪了 我要改代码才能运行
难道其他人直接可以运行么? 


怎么改,FC5 也似有问题
awk: ColorPlot.awk:82: (FILENAME=- FNR=10000) fatal: attempt to use array `X_Label' in a scalar context


 xlink 回复于:2006-09-27 23:32:15

问世间,是否此山最高?


 luanqibazao 回复于:2006-09-28 10:06:08

终于搞出来了,节日快乐


 awk就是awp加ak 回复于:2006-09-28 10:19:21

引用:原帖由 xlink 于 2006-9-27 23:32 发表
问世间,是否此山最高? 


或者,自有高处比天高


 richardhyh 回复于:2006-09-28 11:14:13

在cygwin中运行时候报错了,不知道Myth是干吗用的?请指教

$ awk -f colorcat.awk 1.txt
awk: colorcat.awk:22: (FILENAME=1.txt FNR=1) fatal: attempt to use array `Myth (from Myth)' in a scalar context


 HXP111 回复于:2006-09-29 14:29:50

xiexie


 soaact 回复于:2006-09-29 21:18:46

楼主姐姐真是牛人啊!
顶!


 dayan_he 回复于:2006-09-30 01:30:53

挖卡卡
果然美女一个


 dayan_he 回复于:2006-09-30 03:57:35

在 RHEL AS4.0  全部测试通过


 lrz 回复于:2006-09-30 21:20:56

可FC5下却出错:
awk: ColorPlot.awk:82: (FILENAME=- FNR=10000) fatal: attempt to use array `X_Label' in a scalar context
想知如何解决,

新手


 awk就是awp加ak 回复于:2006-10-01 01:46:22

引用:可FC5下却出错

FC不是跑魂斗罗的么?


 hll 回复于:2006-10-01 23:50:32

好,收藏,感谢!祝节日快乐


 mq110 回复于:2006-10-02 14:07:17

数学功底不错.^_^


 okyou 回复于:2006-10-02 16:07:51

有实用价值吗?


 canoon 回复于:2006-10-02 18:42:54

好啊


 awk就是awp加ak 回复于:2006-10-02 19:04:17

引用:原帖由 okyou 于 2006-10-2 16:07 发表
有实用价值吗? 


看你怎么用了,想拿来当砖头砌楼恐怕是不行


 光明晓仙 回复于:2006-10-03 21:59:49

强人................


 liqingyang 回复于:2006-10-04 20:55:34

学习


 西山晴雪 回复于:2006-10-11 09:50:30

mm太强了。佩服佩服。


 pqxpqx 回复于:2006-12-11 15:10:38

看来shell的功能实在是很强大!


 soaact 回复于:2007-01-29 20:13:47

有哪位知道那个画心的公式是怎么出来的?我想要个类似红桃的倒过来心应该怎么整呢?
谢谢了。


 net_robber 回复于:2007-01-30 12:41:04

还研究不了那么深,先把颜色搞清楚了再说,呵呵


 prc 回复于:2007-01-30 13:47:13

楼主太强了,赞!!


 justicezyx 回复于:2007-01-30 21:27:28

sup...


 sophia_wang99 回复于:2007-04-04 17:41:09

为何我的不行啊

[wanghf2]# awk 'BEGIN{while(u<20){print sin(u)*sin(v),cos(u)*sin(v+u);v=v+0.01;u=u+0.01}}' | awk -f ColorCat.awk
awk: ColorCat.awk:50: (FILENAME=- FNR=2000) fatal: attempt to use array `X_Label' in a scalar context

我的环境是:
gawk-3.1.3-10.1

bash-3.0-19.3


 sophia_wang99 回复于:2007-04-04 18:03:45

哈哈,我知道了,程序一必须执行啊

谢谢~~


 sendqmail 回复于:2007-04-08 23:02:07

好好玩啊!顶啊帮你


 ruifox 回复于:2007-04-09 10:24:45

你太有才了!




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=833305
转载请注明作者名及原文出处