Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4825824
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类:

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.......

阅读(2191) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

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"作用了,谢谢。