Chinaunix

标题: awk打印两个patten之间的行(第3次patten) [打印本页]

作者: 18800375280    时间: 2016-07-17 19:35
标题: awk打印两个patten之间的行(第3次patten)
需求:源文件将1.txt转换为目标文件2.txt
需求解析:打印1.txt第3次patter "xx"至"oo"之间的行(文件中有多个xx,oo,打印第3次出现xx,oo之间的行)
[root@localhost ~]# cat 1.txt
xx
1 2 3
a b c d
ef
eg
235
oo
xx
1111
2222
33
4
oo
45678
xx
aaa
bbbb
ccc
ddd
oo

abhdl
xx
12345678
jjool
oo
[root@localhost ~]#cat 2.txt
xx
aaa
bbbb
ccc
ddd
oo

作者: haooooaaa    时间: 2016-07-17 20:47
  1. awk '/xx/{a++}a==3;/oo/&&a==3{exit}' file
复制代码

作者: blackold    时间: 2016-07-17 21:47
try:
  1. awk '/xx/,/oo/{if(!f){f=!f;c++};if(/oo/)f=!f;if(c==3){print;if(/oo/)exit}}' urfile
复制代码

作者: sunzhiguolu    时间: 2016-07-17 22:08
perl -0777 -nle 'print $2 if(/(.*?(xx.*?)oo){3}/s)' f

xx
aaa
bbbb
ccc
ddd

作者: sunzhiguolu    时间: 2016-07-17 22:28
本帖最后由 sunzhiguolu 于 2016-07-17 22:29 编辑
perl -ne 'if(/xx/../oo/){print if($P and !/oo/);next}$P?exit:$P++' f

xx
aaa
bbbb
ccc
ddd

作者: 18800375280    时间: 2016-07-17 23:17
回复 2# haooooaaa

牛,学习了!
作者: 18800375280    时间: 2016-07-17 23:31
回复 3# blackold

感谢黑哥,如果文本改一下,打印第3次出现xx到,第2次出现oo之间的行,如该何破:
#cat 1.txt
xx
1 2 3
a b c d
ef
eg
235
oo
xx
1111
2222
33
4
45678
xx
aaa
bbbb
ccc
ddd
oo

abhdl
xx
12345678
jjool
oo
作者: 18800375280    时间: 2016-07-17 23:35
回复 4# sunzhiguolu

-077是什么意识啊,perl大神?
作者: sunzhiguolu    时间: 2016-07-17 23:57
回复 7# 18800375280
perl -ne 'if(/xx/.../xx/){next if(!$P);exit if(/oo/);print}$P++' f

xx
aaa
bbbb
ccc
ddd

   
作者: sunzhiguolu    时间: 2016-07-18 00:06
回复 8# 18800375280
我不是 perl 大神, 黑大师是 perl 大神.
perl -077 将文件作为一行读入

   
作者: sunzhiguolu    时间: 2016-07-18 00:38
perl -0777 -ne 'while(m/((xx.*?)oo.*?xx)/sg){print $2 if($P++)}' f

xx
aaa
bbbb
ccc
ddd

作者: songyc_2015    时间: 2016-07-18 00:57
回复 7# 18800375280
  1. awk -vm=3 -vn=2 '/xx/{a++;i=NR}/oo/{b++;j=NR}{if(a==m)f=1;if(f&&i<=NR)c=c?c"\n"$0:$0;if(b==n&&i<=j){print c;exit}}' file
复制代码

作者: blackold    时间: 2016-07-18 09:20
回复 7# 18800375280

按你原来的要求,xx-oo 应该是成对出现, 比如,对于下面的文本:


xx
1
inside
xx
oo
outside
oo
outside
xx
2
inside
xx
outside
oo
outside
oo
xx
3
inside
xx
oo
outside
oo
outside
,原要求应得到:

xx
3
inside
oo

新要求要得到什么?

作者: 18800375280    时间: 2016-07-18 09:59
回复 13# blackold
#cat 1.txt.new  (源文件)   (需求变为:打印第3次出现xx,到第2次出现oo,之间的行,全文中出现了4次xx,3次oo。)
xx
1 2 3
a b c d
ef
eg
235
oo
xx
1111
2222
33
4
45678
xx
aaa
bbbb
ccc
ddd
oo

abhdl
xx
12345678
jjool
oo
#cat 2.txt.new(目标文件)
xx
aaa
bbbb
ccc
ddd
oo

作者: 18800375280    时间: 2016-07-18 10:10
回复 12# songyc_2015
随意哥的代码好使,就是看蒙圈了
作者: blackold    时间: 2016-07-18 10:15
回复 14# 18800375280


    汗,还有这种要求?

照你的描述,第二次oo出现在第3次xx之后:
  1. awk '/oo/{b++;}/xx/{c++;if(c<3)next}c==3;b==2{exit}' urfile
复制代码

作者: blackold    时间: 2016-07-18 10:17
回复 14# 18800375280


     汗,还有这种要求?

照你的描述,第二次oo出现在第3次xx之后:
  1. awk '/oo/{b++;}/xx/{c++;if(c<3)next}c==3;b==2{exit}' urfile
复制代码

作者: blackold    时间: 2016-07-18 10:20
回复 14# 18800375280


     汗,还有这种要求?

照你的描述,第二次oo出现在第3次xx之后:
  1. awk '/oo/{b++;}/xx/{c++;if(c<3)next}c==3;b==2{exit}' urfile
复制代码

作者: blackold    时间: 2016-07-18 10:23
回复 14# 18800375280


     汗,还有这种要求?

照你的描述,第二次oo出现在第3次xx之后:
  1. awk '/oo/{b++;}/xx/{c++;if(c<3)next}c==3;b==2{exit}' urfile
复制代码

作者: 18800375280    时间: 2016-07-18 10:46
回复 19# blackold
对的,第2次oo在第3次xx之后!
作者: blackold    时间: 2016-07-18 10:48
回复 20# 18800375280


    擦,不是显示发贴失败吗?怎么连发了好几次。
作者: 18800375280    时间: 2016-07-18 10:54
回复 21# blackold
可能是cu系统问题
作者: 18800375280    时间: 2016-07-18 11:35
回复 11# sunzhiguolu
oo没有打印额,要把oo也打印出来的!
作者: sunzhiguolu    时间: 2016-07-18 12:41
  1. perl -0777 -ne 'while(m/((xx.*?oo).*?xx)/sg){print $2 if($P++)}' f
复制代码
xx
aaa
bbbb
ccc
ddd
oo

作者: sunzhiguolu    时间: 2016-07-18 12:41
本帖最后由 sunzhiguolu 于 2016-07-18 12:46 编辑


xx
1 2 3
a b c d
ef
eg
235
oo
xx

1111
2222
33
4
45678
xx
aaa
bbbb
ccc
ddd
oo

abhdl
xx

12345678
jjool
oo

其实需要的文本都是非常有规律的, 找到规律匹配一下 打印就是了.
作者: 18800375280    时间: 2016-07-18 13:17
回复 24# sunzhiguolu
这回可以了
作者: moperyblue    时间: 2016-07-18 13:18
  1. sed -r '/^xx$/{x;s/^/./;/.{3}/{x;:a;N;/\noo$/!ba;q};x};d'
复制代码

作者: 18800375280    时间: 2016-07-18 13:22
回复 27# moperyblue
打点计数加标签,666
作者: bomingjie    时间: 2018-01-09 11:55
回复 3# blackold

由于没有权限给你发送消息,只能通过回帖子了。希望你能看到

awk '/xx/,/oo/{if(!f){f=!f;c++};if(/oo/)f=!f;if(c==3){print;if(/oo/)exit}}' urfile

来自:
blackold 回复了 18800375280 的话题 awk打印两个patten之间的行(第3次patten)

问题:
我看不懂,可否给出注释或者网上文章,帮我学习,谢谢

作者: bomingjie    时间: 2018-01-09 11:55
回复 3# blackold

awk '/xx/,/oo/{if(!f){f=!f;c++};if(/oo/)f=!f;if(c==3){print;if(/oo/)exit}}' urfile


问题:
我看不懂,可否给出注释或者网上文章,帮我学习,谢谢

作者: bomingjie    时间: 2018-01-09 11:56
回复 3# blackold

问题:
我看不懂,可否给出注释或者网上文章,帮我学习,谢谢
  1. awk '/xx/,/oo/{if(!f){f=!f;c++};if(/oo/)f=!f;if(c==3){print;if(/oo/)exit}}' urfile
复制代码



作者: bomingjie    时间: 2018-01-09 11:59
    awk '/xx/,/oo/{if(!f){f=!f;c++};if(/oo/)f=!f;if(c==3){print;if(/oo/)exit}}' urfile

黑哥,请帮忙解释一下,谢谢
作者: jason680    时间: 2018-01-09 13:36
回复 32# bomingjie

here you are

http://bbs.chinaunix.net/thread-2309494-1-1.html

http://bbs.chinaunix.net/thread-4246512-1-1.html

作者: wh7211    时间: 2018-01-10 10:07
本帖最后由 wh7211 于 2018-01-10 10:11 编辑

回复 32# bomingjie


14楼需求变为:打印第3次出现xx,到第2次出现oo,之间的行,全文中出现了4次xx,3次oo

$ cat 1
xx
1 2 3
a b c d
ef
eg
235
oo
xx
1111
2222
33
4
45678
xx
aaa
bbbb
ccc
ddd
oo
abhdl
xx
12345678
jjool
oo
  1. awk '/xx/{a++;f=a==3?1:0}f{print>"2"};/oo/{f=0}' 1
复制代码

$ cat 2
xx
aaa
bbbb
ccc
ddd
oo

作者: bomingjie    时间: 2018-01-12 10:26
回复 34# wh7211

正在看你给的信息。 估计我水平较差。还是没有看懂。正在补足基础awk

作者: sunlove521    时间: 2018-02-04 17:30
awk '$0~/xx/{x++}{if(x>=3)print $0}x>=3&&$0~/^oo/{exit}'  1.txt
作者: sunlove521    时间: 2018-02-04 17:31
awk '$0~/xx/{x++}{if(x>=3)print $0}x>=3&&$0~/^oo/{exit}'  yourfile




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2