人生如逆旅,我亦是行人!江湖人称wsjjeremy.blog.chinaunix.net
ubuntuer
全部博文(930)
intern(3)
string(19)
正则表达式(5)
2011年(60)
2010年(220)
2009年(371)
2008年(279)
baocheng
nba76ers
renjian2
qq576709
mcn304
zibuyule
西农魔峰
曾德标
zhuqing_
shanck
tendy
moshangx
wb123456
smile124
hjshajsh
chenhong
bzhao
python16
分类:
2008-10-28 21:37:35
awk的RS,ORS好像都快被我遗忘了,最近看黑哥和tim兄写的几个脚本,才感该原来这两东东是这么的强大. 直接上例子,不废话了 请问各位,现在有一个文件里面的格式是这样的 begin "aaa" xxxxxx xxxxxx end begin "bb" xxxxx xxxxx xxxxx end ........ 现在想把这个文件分解成小的文件用 begin 后面的部分来作为文件名保存,请问有没有好的办法来解决呢? zj@zj:~/Script/cushell/08.10.27$ awk -F'[ "]+' '/begin/{file=$2;next}$0!="end"{print >> file}' sed zj@zj:~/Script/cushell/08.10.27$ cat aaa xxxxxx xxxxxx zj@zj:~/Script/cushell/08.10.27$ cat bb xxxxx xxxxx xxxxx zj@zj:~/Script/cushell/08.10.27$ awk -v RS="\nend\n" -F '[ "]+' '$2{print $0"\nend">>$2;close($2)}' sed http://hi.baidu.com/xemoaya/blog/item/37708026cbf18e148a82a18e.html eg1: zj@zj:~/Script/cushell/08.10.28$ cat a.txt [aaa] a=1 b=2 c=3 [bbb] a=11 b=22 c=33 [ccc] a=111 b=222 c=333 如何直接获得bbb项目中的b的值? zj@zj:~/Script/cushell/08.10.28$ awk -v RS="[" '/bbb/{print $3}' a.txt b=22 zj@zj:~/Script/cushell/08.10.28$ awk -v RS="[" 'NR==2{print $0}' a.txt aaa] a=1 b=2 c=3 RS记录分割符为"["的话,则bbb] a=11 b=22 c=33被当作一条记录,这个时候$3就是b=22了. 你可以自己试试不用RS,这怎么写.别特殊话^_^ awk 'NR==6{print $0}' a.txt 你要是这么写我都难得BS你. eg2: zj@zj:~/Script/cushell/08.10.28$ cat b.txt begin "aaa" xxxxxx xxxxxx end begin "bb" xxxxx xxxxx xxxxx end 问题: 现在想把这个文件分解成小的文件用 begin 后面的部分来作为文件名保存,请问有没有好的办法来解决呢? 这个是我写的. zj@zj:~/Script/cushell/08.10.28$ awk -F'[ "]+' '/begin/{file=$2;next}$0!="end"{print >> file}' b.txt zj@zj:~/Script/cushell/08.10.28$ cat aaa xxxxxx xxxxxx zj@zj:~/Script/cushell/08.10.28$ cat bb xxxxx xxxxx xxxxx 黑哥的 zj@zj:~/Script/cushell/08.10.28$ awk -v RS="\nend\n" -F '[ "]+' '$2{print $0"\nend">>$2;close($2)}' b.txt zj@zj:~/Script/cushell/08.10.28$ awk -v RS="\nend\n" -F '[ "]+' 'NR==1{print $0}' b.txt begin "aaa" xxxxxx xxxxxx 可以看出这个时候记录就是以end分割的了 zj@zj:~/Script/cushell/08.10.28$ cat aaa begin "aaa" xxxxxx xxxxxx end zj@zj:~/Script/cushell/08.10.28$ cat bb begin "bb" xxxxx xxxxx xxxxx end 好了就这么多了,还有不懂的或觉得我说的有不妥之处的话,随时聆听赐教^_^
貌似这个帖子还算火,补个今天见识的又一个RS应用
我有一个这样的文本 aaaaaaa bbbbbbbb cccccccccc ddddddd 我想把前的一个回车删掉,即变成这样 aaaaaaa bbbbbbbb cccccccccc ddddddd
awk 'BEGIN{RS="\n";ORS=""}1' urfile再次说下强大,以后一定要牢记在心RS,RS.......
上一篇:shell进制转换以及bc
下一篇:教你用c实现http协议
spyman2008-11-05 00:03:02
感觉awk是最强大的文本编辑工具,多谢ubuntuer兄弟,能不能多介绍一些awk的工具脚本了。
ubuntuer2008-10-31 09:36:34
我知道大家包括我一般都只用到fs,ofs. rs就是输入记录分割符,默认是\n.每次我们不是称一条记录就是一行. awk -v RS="\nend\n" -F '[ "]+' 'NR==1{print $0}' b.txt这里你可以print $1 or $2 $3....你就明白了. 就是说现在一条记录就是begin "aaa" xxxxxx xxxxxx了 相当于默认一行.我说的够清楚了吧^_^
spyman2008-10-30 23:28:02
大开眼界,能不能解释下面的作用了。 awk -v RS="\nend\n" -F '[ "]+' 'NR==1{print $0}' b.txt中的 RS="\nend\n"作用了,谢谢。
登录 注册