亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2185 | 回復: 6
打印 上一主題 下一主題

對唐詩三百首的反思 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2007-03-25 12:33 |只看該作者 |倒序瀏覽
兩年之前,我偶然看到Winter博客上一篇《強大的Sed命令--背唐詩的Shell小程序》的小文章,引發(fā)了我對Shell編程的興趣。對sed, awk命令進行了深入研究。在CU的Shell論壇上修煉多日。今天在回頭看這篇文章,有一些反思。
    Winter的這個唐詩程序為了隨機抽取唐詩顯示,卻寫了20多行,使用了諸多種類命令,同時也沒有體現(xiàn)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

復制代碼


如果唐詩總數(shù)目小于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命令可以達到你意想不到效果。

這里就有一個很有意思的例子,請看題:


現(xiàn)在有300多首唐詩放在一個文本文件中,格式是用"% 。。。%"分開,中間是一首唐詩,例如:%
%
《西施詠》
作者:王維
艷色天下重,西施寧久微。
朝為越溪女,暮作吳宮妃。
賤日豈殊眾,貴來方悟稀。
邀人傅粉粉,不自著羅衣。
君寵益嬌態(tài),君憐無是非。
當時浣紗伴,莫得同車歸。
持謝鄰家子,效顰安可希。
%
《秋登蘭山寄張五》
作者:孟浩然
北山白云里,隱者自怡悅。
相望始登高,心隨雁飛滅。
愁因薄暮起,興是清秋發(fā)。
時見歸村人,沙行渡頭歇。
天邊樹若薺,江畔洲如月。
何當載酒來,共醉重陽節(jié)。
%

現(xiàn)在要求每次運行程序,系統(tǒng)會隨機選一首唐詩打印出來。要是你會如何做?
看看我這段腳本,總共才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 [報告]
發(fā)表于 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 [報告]
發(fā)表于 2007-03-25 13:02 |只看該作者

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

樓上一夢兄的好快~

論壇徽章:
0
4 [報告]
發(fā)表于 2007-03-25 13:06 |只看該作者
呵呵,吃飽喝足做做運動~

論壇徽章:
1
榮譽會員
日期:2011-11-23 16:44:17
5 [報告]
發(fā)表于 2007-03-25 13:19 |只看該作者
原帖由 一夢如是 于 2007-3-25 13:06 發(fā)表
呵呵,吃飽喝足做做運動~

哈哈哈哈, 這點運動對你來說, 小case呀~

論壇徽章:
0
6 [報告]
發(fā)表于 2007-03-25 14:34 |只看該作者
受教。
不知Sed有無簡潔的解法?

論壇徽章:
0
7 [報告]
發(fā)表于 2007-03-25 22:01 |只看該作者
太深了,我得繼續(xù)努力
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP