免费注册 查看新帖 |

Chinaunix

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

请大家出谋划策,多谢了! [复制链接]

论坛徽章:
0
11 [报告]
发表于 2003-03-17 16:20 |只看该作者

请大家出谋划策,多谢了!

name=$1
name_length=`expr $name : ".*"`
name_length=`expr $name_length + 3`
weekday=`expr $2 + 4`
timer=$3
tmp="s"
eval printf \"\%\-$name_length$tmp MTWTF--MTWTF--MTWTF--MTWTF--MTWTF--MTWTF\\n\"
NAME
echo "$name\c"
star=""
i=1
while [ $timer -gt 0 ]
do
        k=`echo $i % 7|bc`
        if [ $i -lt $weekday ];then
                star=$star" "
        else
                if [ $k -eq 6 ];then
                        star=$star'--'
                        i=`expr $i + 1`
                else
                        star=$star'*'
       timer=`expr $timer - 1`
                fi
        fi
        i=`expr $i + 1`
done
printf "%s\n" "$star"

#./8 ilyilyilyily 5 15
NAME            MTWTF--MTWTF--MTWTF--MTWTF--MTWTF--MTWTF
ilyilyilyily                 ****--*****--*****--*

论坛徽章:
0
12 [报告]
发表于 2003-03-17 16:33 |只看该作者

请大家出谋划策,多谢了!

....

  1. #!/bin/sh

  2. # 定义人名的最大长度
  3. NAMELEN=10

  4. # 子函数, 用来生成甘特图, 带四个参数 人名、起始日、项目天数、项目名称
  5. ganttbar() {
  6. NAME="$1"
  7. d=$2
  8. i=$3
  9. PROJ="$4"

  10. SBAR=`awk  -v begin=$d -v dur=$i 'END {
  11.     while ( x < dur ) {
  12.         if ( begin % 7 == 0 ) begin++
  13.         offset = 5 - begin % 7
  14.         while ( ++y < begin ) printf " "
  15.         printf "*"
  16.         if ( (x-offset) % 5 == 0 )  printf "--"
  17.         x++
  18.     }
  19. }' < /dev/null | sed 's/--$//g'`

  20. TITLELEN=${#PROJ}
  21. BARLEN=${#SBAR}
  22. STARTPOS=`expr $d + \( $BARLEN - $TITLELEN - $d \) / 2 `
  23. SBAR=`printf "%${BARLEN}s" $SBAR | sed "{
  24.     s/\(.\{$STARTPOS\}\)\(.\{$TITLELEN\}\)/\1$PROJ/
  25. }"`
  26. printf "%-${NAMELEN}s|$SBAR\n" "$NAME"
  27. }

  28. BAR="MTWTF--MTWTF--MTWTF--MTWTF--MTWTF--MTWTF"
  29. printf "%-${NAMELEN}s|$BAR\n" "NAME"

  30. # 调用子函数的几例
  31. ganttbar "Leader" 2 25 "Nothing to do"
  32. ganttbar "Pimkie" 3 10 "T1"
  33. ganttbar "James Bond" 5 15 "Task 2"
  34. ganttbar "Dora" 8 17 "H"
  35. # the 7th day is Sunday, it should be as same as above
  36. ganttbar "Monika" 7 17 "Task Three"
  37. ganttbar "Fanqiang" 18 11 "Admin"
复制代码



不知有否解决你的问题。

论坛徽章:
0
13 [报告]
发表于 2003-03-17 16:42 |只看该作者

请大家出谋划策,多谢了!

...

在 OpenBSD 测试通过,运行结果为

# sh gantt.sh

  1. NAME      |MTWTF--MTWTF--MTWTF--MTWTF--MTWTF--MTWTF
  2. Leader    | ****--*****Nothing to do*--*****--*
  3. Pimkie    |  ***--*T1**--**
  4. James Bond|    *--*****Task 2*--****
  5. Dora      |       *****--****H--*****--**
  6. Monika    |       *****-Task Three***--**
  7. Fanqiang  |                 **--*Admin-****
复制代码

论坛徽章:
0
14 [报告]
发表于 2003-03-17 16:56 |只看该作者

请大家出谋划策,多谢了!

...

faint~~  

没对齐!不过这是论坛的关系,在屏幕上是对齐的。

论坛徽章:
0
15 [报告]
发表于 2003-03-17 16:57 |只看该作者

请大家出谋划策,多谢了!

呵呵,红袖的总是这么简洁.

论坛徽章:
0
16 [报告]
发表于 2003-03-17 17:06 |只看该作者

请大家出谋划策,多谢了!

...

过奖了~~  :)

论坛徽章:
0
17 [报告]
发表于 2003-03-17 17:34 |只看该作者

请大家出谋划策,多谢了!

SBAR=`awk  -v begin=$d -v dur=$i 'END {
    while ( x < dur ) {
        if ( begin % 7 == 0 ) begin++
        offset = 5 - begin % 7
        while ( ++y < begin ) printf " "
        printf "*"
        if ( (x-offset) % 5 == 0 )  printf "--"
        x++
    }
}' < /dev/null | sed 's/--$//g'`

printf "%-${NAMELEN}s|$BAR\n" "NAME"

我不太明白,麻烦红袖讲解一下好吗?

论坛徽章:
0
18 [报告]
发表于 2003-03-17 18:15 |只看该作者

请大家出谋划策,多谢了!

...


SBAR=`awk -v begin=$d -v dur=$i 'END {
     # x 没有赋值,取0,dur就是项目的天数,也就是这里将做一个循环
     while ( x < dur ) {
          # 如果 开始为7,表示为星期天,是不合法的,因为你说过周末排除,所以顺延一天
          # 当然还有周六的情况,也应该做进去,这里没有,不过这是在子函数中,如果你自己
          # 心中有数的话,也无所谓
          if ( begin % 7 == 0 ) begin++
          # 这里表示一个位移,比如第3天开始,位移就是2,每4天开始,位移就是1,依此类推
          # 用来保证每5天打两个“-”,和标题对齐的
          offset = 5 - begin % 7
          # 只要没到开始日,打印空格,这应该好理解
          while ( ++y < begin ) printf " "
          # 接下来打印*表示项目开始
          printf "*"
          # 完成5天一个循环,打印两天--表示周末,x不累加,也就是说周末未计入工时
          if ( (x-offset) % 5 == 0 ) printf "--"
          # 否则,正常情况,x 累加
          x++
     }
}' < /dev/null | sed 's/--$//g'`    # 最后一个 sed 处理一下处在末尾的无意义的--


printf "%-${NAMELEN}s|$BAR\n" "NAME"
格式打印,NAMELEN 是你预先定义好的一个常数,假设取8,就是

printf "%-8s|$BAR\n" "NAME"

NAME 这个字串,取8位长,不足补空格,"-"表示左对齐,如没有"-"没有,则为右对齐

论坛徽章:
0
19 [报告]
发表于 2003-03-17 18:17 |只看该作者

请大家出谋划策,多谢了!

...


  1. SBAR=`awk -v begin=$d -v dur=$i 'END {
  2.      # x 没有赋值,取0,dur就是项目的天数,也就是这里将做一个循环
  3.      while ( x < dur ) {
  4.           # 如果 开始为7,表示为星期天,是不合法的,因为你说过周末排除,所以顺延一天
  5.           # 当然还有周六的情况,也应该做进去,这里没有,不过这是在子函数中,如果你自己
  6.           # 心中有数的话,也无所谓
  7.           if ( begin % 7 == 0 ) begin++
  8.           # 这里表示一个位移,比如第3天开始,位移就是2,每4天开始,位移就是1,依此类推
  9.           # 用来保证每5天打两个“-”,和标题对齐的
  10.           offset = 5 - begin % 7
  11.           # 只要没到开始日,打印空格,这应该好理解
  12.           while ( ++y < begin ) printf " "
  13.           # 接下来打印*表示项目开始
  14.           printf "*"
  15.           # 完成5天一个循环,打印两天--表示周末,x不累加,也就是说周末未计入工时
  16.           if ( (x-offset) % 5 == 0 ) printf "--"
  17.           # 否则,正常情况,x 累加
  18.           x++
  19.      }
  20. }' < /dev/null | sed 's/--$//g'`    # 最后一个 sed 处理一下处在末尾的无意义的--


  21. printf "%-${NAMELEN}s|$BAR\n" "NAME"
  22. 格式打印,NAMELEN 是你预先定义好的一个常数,假设取8,就是

  23. printf "%-8s|$BAR\n" "NAME"

  24. NAME 这个字串,取8位长,不足补空格,"-"表示左对齐,如没有"-"没有,则为右对齐

复制代码

论坛徽章:
0
20 [报告]
发表于 2003-03-18 02:11 |只看该作者

请大家出谋划策,多谢了!

在linux下运行
出错提示如下:
sed -e expression #1 char 36 :invalid content of  \{\}

差点忘了谢谢各位了
这里的人真好啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP