Chinaunix
标题:
如何在多个类似文本中的一段重复段落里面提取关键词
[打印本页]
作者:
leonlaf
时间:
2014-02-10 10:58
标题:
如何在多个类似文本中的一段重复段落里面提取关键词
各位大神,小弟刚开始接触shell script这玩意儿,发现各种抽象,各种难理解T.T,现在有多个文本含有相似内容如下:
Start aa:123
bb:456
cc:111
dd:3534
End
Start aa:64535
bb:44567
cc:111
dd:74345
End
Start aa:9876
bb:75467
cc:111
dd:2346
End
.
.
.
我想要在每个Start .... End段落中间判断有没有cc:111这一关键字符串,如果有,输出这一段中的aa
xx和bb
xx。
我现在能想到的是先用awk取出每一个Start....End段落,然后再用一个if循环加grep判断cc是否等于111,然后再用grep提取aa和bb,最后再套一个for循环对每一个文本进行操作。但是具体不是很会写,尝试了几次输出的东西都不对,哪位大神能指点下?或者哪位大神有更好点儿的方法?万分感谢!
作者:
ly5066113
时间:
2014-02-10 11:09
回复
1#
leonlaf
try:
awk -v RS=End '/cc:111/{print $2,$3}' file
复制代码
作者:
jason680
时间:
2014-02-10 11:30
回复
1#
leonlaf
$ awk -F: '/aa:/{aa=$2}/bb:/{bb=$2}/cc:/{if($2==111)print "aa:"aa"\nbb:"bb;aa=bb=""}' FILE
aa:123
bb:456
aa:64535
bb:44567
aa:9876
bb:75467
作者:
yestreenstars
时间:
2014-02-10 11:34
awk -vRS='Start' '/cc:111/{print $1,$2}'
复制代码
作者:
laliheyi
时间:
2014-02-10 11:58
回复
1#
leonlaf
sed -rn '/^Start/,/^End/{H;/cc:111/{g;s/.*(aa:[0-9]*).*(bb:[0-9]*).*/\1\n\2/p}}'
复制代码
作者:
elu_ligao
时间:
2014-02-10 23:00
awk -v RS="Start" 'NR>=2{s=0;for(i=1;i<=NF;++i){split($i,rs,":");if($i~/aa:/)a=rs[2];else if($i~/bb:/)b=rs[2];else if($i~/cc:/&&"111"==rs[2])s=1}if(s)print "aa:"a"\nbb:"b;a=b=""}'
复制代码
作者:
jackhuntcn
时间:
2014-02-11 09:24
$ sed -rn '/^Start/{:a;N;/End$/!ba;/cc:111/s/^.*(aa:.*)\n.*(bb:.*)\n.*cc:.*/\1\n\2/p}' urfile
aa:123
bb:456
aa:64535
bb:44567
aa:9876
bb:75467
复制代码
作者:
423497786
时间:
2014-02-11 10:14
回复
2#
ly5066113
你这么写如果cc后面跟着3个以上的1不都打印出来了吗,人家要求的是3个1
作者:
423497786
时间:
2014-02-11 10:16
awk -vRS="End" '{if (substr($4,index($4,":")+1)==111) print $2,$3}'
作者:
423497786
时间:
2014-02-11 10:17
回复
4#
yestreenstars
你这么写如果cc后面跟着3个以上的1不都打印出来了吗,人家要求的是3个1
作者:
yestreenstars
时间:
2014-02-11 10:43
回复
10#
423497786
You are right. 那就加上边界符吧~
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2