免费注册 查看新帖 |

Chinaunix

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

对唐诗三百首的反思 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-25 12:33 |只看该作者 |倒序浏览
两年之前,我偶然看到Winter博客上一篇《强大的Sed命令--背唐诗的Shell小程序》的小文章,引发了我对Shell编程的兴趣。对sed, awk命令进行了深入研究。在CU的Shell论坛上修炼多日。今天在回头看这篇文章,有一些反思。
    Winter的这个唐诗程序为了随机抽取唐诗显示,却写了20多行,使用了诸多种类命令,同时也没有体现Sed的强大。
    其实这个功能用寥寥几行就能完成。


  1. total=`grep '%' tang300.txt | wc -l`
  2. awk -v "myp=$total" -v "thernd=$RANDOM"  '
  3.       BEGIN{ RS="%";myp=int(thernd*(myp-1)/32767+2);}
  4.      (NR==myp){ print $0; exit; } ' tang300.txt

复制代码


如果唐诗总数目小于256


  1. total=`grep % tang300.txt | wc -l`
  2. myp=`echo "$RANDOM * $total / 32767 + 1" | bc -q`
  3. sed -n "/%/{H;g;/\\(\\n%\\)\\{$myp\\}/{:a
  4. N;\$q;/%\$/!ba
  5. s/\\n%//g;p;q;};}" tang300.txt

复制代码




原文出处http://www.winterxy.com/blog/000134.html
强大的Sed命令--背唐诗的Shell小程序


Sed命令是Unix/Linux平台上的行编辑工具,正确使用Sed命令可以达到你意想不到效果。

这里就有一个很有意思的例子,请看题:


现在有300多首唐诗放在一个文本文件中,格式是用"% 。。。%"分开,中间是一首唐诗,例如:%
%
《西施咏》
作者:王维
艳色天下重,西施宁久微。
朝为越溪女,暮作吴宫妃。
贱日岂殊众,贵来方悟稀。
邀人傅粉粉,不自著罗衣。
君宠益娇态,君怜无是非。
当时浣纱伴,莫得同车归。
持谢邻家子,效颦安可希。
%
《秋登兰山寄张五》
作者:孟浩然
北山白云里,隐者自怡悦。
相望始登高,心随雁飞灭。
愁因薄暮起,兴是清秋发。
时见归村人,沙行渡头歇。
天边树若荠,江畔洲如月。
何当载酒来,共醉重阳节。
%

现在要求每次运行程序,系统会随机选一首唐诗打印出来。要是你会如何做?
看看我这段脚本,总共才20来行:

#!/bin/sh

DATAFILE=/home/wende/bin/tang300.u8
IDXFILE=$DATAFILE.idx.txt
if [ ! -e $IDXFILE ] ;then
grep -n "%" $DATAFILE | awk -F':' '{print $1}' > $IDXFILE;
fi
LINECNT=`wc -l $IDXFILE|awk '{print $1}'`;
FIRST=`expr $RANDOM % $LINECNT`
let SECOND=$FIRST+1;

CMD="sed -n -e '$FIRST p' $IDXFILE";
start=`eval $CMD`
CMD="sed -n -e '$SECOND p' $IDXFILE";
end=`eval $CMD`

let start=$start+1
let end=$end-1;
CMD="sed -n -e '$start,$end p' $DATAFILE";
eval $CMD

看明白了吗?其中使用了sed, awk, grep, eval, expr, wc, let 等命令。如果你对这些命令不了解,可以看看: 深入浅出Shell编程

论坛徽章:
0
2 [报告]
发表于 2007-03-25 12:57 |只看该作者
  1. awk 'BEGIN{RS="\n*% *\n"}NR=='$((RANDOM%($(grep -c % file)-1)+2)) file
复制代码

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
3 [报告]
发表于 2007-03-25 13:02 |只看该作者

  1. awk 'BEGIN{RS=ORS="%"}NR=='"$((RANDOM%300+1))"'' filename
复制代码

楼上一梦兄的好快~

论坛徽章:
0
4 [报告]
发表于 2007-03-25 13:06 |只看该作者
呵呵,吃饱喝足做做运动~

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
5 [报告]
发表于 2007-03-25 13:19 |只看该作者
原帖由 一梦如是 于 2007-3-25 13:06 发表
呵呵,吃饱喝足做做运动~

哈哈哈哈, 这点运动对你来说, 小case呀~

论坛徽章:
0
6 [报告]
发表于 2007-03-25 14:34 |只看该作者
受教。
不知Sed有无简洁的解法?

论坛徽章:
0
7 [报告]
发表于 2007-03-25 22:01 |只看该作者
太深了,我得继续努力
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP