免费注册 查看新帖 |

Chinaunix

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

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

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

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

还有awk中 -v这个参数是什么意思。我一直也没有查到。。。
以及TITLELEN=${#PROJ}
是什么意思?为什么pro前要加#?

再次谢过!

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

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

...

awk 中的 -v 是赋值
TITLELEN=${#PROJ}  是把变量 PROJ 的字符串长度赋给 TITLELEN

(我刚才在Solaris也试了一下,很奇怪,是有问题。可上午确实在我的OpenBSD机器上试验通过的。

我正在找原因,不过不一定能马上有结果。。。)

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

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

...

第一步结果有了。是因为我在OpenBSD上的shell环境是ksh,而我这里Solaris下用的是sh,这种 TITLELEN=${#PROJ} 用法不支持,所以就出现

bad substitution 错误。

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

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

...

可以了,在 Solaris8 下测试通过。气死我了,居然是这样,

1。printf 不能和 sed 一起用。
2。sed 不能跟在 awk 后面的管道。

这里用的是ksh,如果是linux,应该改成bash(估计没问题,bash具备很多ksh的功能)。

  1. #!/usr/bin/ksh

  2. NAMELEN=10

  3. ganttbar() {
  4.     NAME="$1"
  5.     d=$2
  6.     i=$3
  7.     PROJ="$4"

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

  18.     SBAR=`echo "$SBAR" | sed 's/--$//g'`

  19.     TITLELEN=${#PROJ}
  20.     BARLEN=${#SBAR}
  21.     STARTPOS=`expr $d + \( $BARLEN - $TITLELEN - $d \) / 2 `

  22.     SBAR=`echo "$SBAR"  | sed -e "{
  23.         s/\(.\{$STARTPOS\}\)\(.\{$TITLELEN\}\)/\1$PROJ/
  24.      }"`
  25.     printf "%-${NAMELEN}s|$SBAR\n" "$NAME"
  26. }

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

  29. ganttbar "Leader" 2 24 "Nothing to do"
  30. ganttbar "Pimkie" 3 10 "T1"
  31. ganttbar "James Bond" 5 15 "Task 2"
  32. ganttbar "Dora" 8 17 "H"
  33. ganttbar "Monika" 7 17 "Task Three"
  34. ganttbar "Fanqiang" 18 11 "Admin"
复制代码

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

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

-v在awk原来是赋值啊!我还以为和grep一样是显示不包含匹配文本的所有行呢。

还有nawk是什么意思?
TITLELEN=${#PROJ} 是把变量 PROJ 的字符串长度赋给 TITLELEN
在哪部分只是中可能有描述?我找找看。

谢谢红袖。

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

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

原帖由 "pariswood"]-v在awk原来是赋值啊!我还以为和grep一样是显示不包含匹配文本的所有行呢。[/quote 发表:


呵呵,还真象~

[quote]还有nawk是什么意思?


哦,这是我在solaris下用的,你只要用 awk 或 gawk 就行了。

TITLELEN=${#PROJ} 是把变量 PROJ 的字符串长度赋给 TITLELEN
在哪部分只是中可能有描述?我找找看。


应该是 man bash 就有,在 Solaris 下,man ksh 讲得挺详细的。
如果没有的话,只能找本有关 ksh 或 bash 的书了。

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

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

...

顺便传一张图,Solaris 下的演示。不知道这样子,是不是满意?

gannt.jpg (36.17 KB, 下载次数: 132)

gannt

gannt

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

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

SBAR=`echo "$SBAR"  | sed -e "{
        s/\(.\{$STARTPOS\}\)\(.\{$TITLELEN\}\)/\1$PROJ/
     }"`
这一句还是通不过,仍然报错
sed -e expression #1 char 36 :invalid content of \{\}

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

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

...

我希望能找台 linux 机器测试一下……

(不过不一定有)

invalid content of ... 可能是因为 $STARTPOS 或 $TITLELEN 没有取到值为0或前面的步骤异常,使它成为负值,你可以用

# bash -x gantt.sh

来跟踪一下变量,或者自己加几句打印语句,看有没有取到合理的值。

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

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

我已经测试了,都是正常值的。。。
我把所有{和}前面的\去掉,程序可以执行,但是$proj没有打印出来。
SBAR=`echo "$SBAR" | sed -e "{
s/\(.\{$STARTPOS\}\)\(.\{$TITLELEN\}\)/\1$PROJ/
}"`
我不是很明白这一句的用法。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP