Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3031786
  • 博文数量: 272
  • 博客积分: 5544
  • 博客等级: 大校
  • 技术积分: 5496
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 00:48
个人简介

  每个人都要有一个骨灰级的爱好,不为金钱,而纯粹是为了在这个领域享受追寻真理的快乐。

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2011-05-21 00:48:10

 

 

  1. $ cat file
  2. This is a 2 test !
  3. only test 3.
  4. 5 includes.
  5. 1 file.

 

要求以上文本中出现过的数字相加。

 

 

  1. awk -v RS='[0-9]+' '{s+=RT}END{print s}' file
  2. 11

[解析]

  把RS记录分割符设置成一个正则,匹配一个或多个数字的字符段为记录分割符。RT就是当RS为正则表达式时的匹配到的每个记录的分割符的内容即为RT变量表示。那么把RT累加给变量s,然后最后输出该值。达到了把所有文本中出现过的数字相加。这里还有一个小细节不要放过,就是 + 号,该符号在BREs正则表达式中是不支持这样写的正确的写法是 \+ ,但是awk默认是使用的EREs正则表达式,所以支持 + 号的写法,大家注意区分。

 

文本内容如下,现在想获取begin和end之间同时含有BBCC、EEFF两个字符串的段,并打印出来。
begin
AABB
AACC
end
begin
BBCC
EEFF
end
begin
ABCD
HIGJ
end
begin
ABCD
ABEF
end

打印结果应为:
begin
BBCC
EEFF
end

 

  1. $ awk 'BEGIN{RS="begin|end"}/BBCC.*EEFF/{print "begin"$0RT}' file
  2. begin
  3. BBCC
  4. EEFF
  5. end

[解析]

  为什么RT是end?阁下想明白了吗?

 

 

如何抽取匹配行下第三行不为空时,匹配行下面三行行内容:
  1. TAG 1
  2. 444


  3. TAG 2



  4. TAG 3
  5. 111
  6. 222
  7. 333

把匹配行指定的域内容提取出来添加到输出结果中:

3  111
3  222
3  333

 

 

  1. awk -vRS="TAG [0-9]+" 'NF>2{for(i=1;i<=NF;i++){print NR-1,$i}}' file

[解析]

  把每段文本的开始标记行作为RS,不难了吧。

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