Chinaunix

标题: 如何提取特定符号行中的关键字并输出随后几行 [打印本页]

作者: tingshuibanxia    时间: 2016-07-25 11:46
标题: 如何提取特定符号行中的关键字并输出随后几行
请教大家,例如有文件A是这样:

>H1_22 ASDSF AA BB 1111
ASDSJFKJKDJF
DSJFKDJFDJDFDFD
>F2_44_3 SDKS BB DF 2323
DFDSFDDGJFGLJFLDL
>SDS_22 DFD AA FDD 1111
FDSFDSFDGDG
FDFDSFDGFDGTHTYU
FDGRFHHHHHHHHHH
.......

如何将以>号开头的行中第3列为AA的行以及随后的几行提取出来?
生成这样:
>H1_22 ASDSF AA BB 1111
ASDSJFKJKDJF
DSJFKDJFDJDFDFD
>SDS_22 DFD AA FDD 1111
FDSFDSFDGDG
FDFDSFDGFDGTHTYU
FDGRFHHHHHHHHHH
作者: elu_ligao    时间: 2016-07-25 11:58
  1. awk '/>/{f=$3=="AA"?1:0}f'
复制代码

作者: tingshuibanxia    时间: 2016-07-25 12:02
回复 2# elu_ligao


谢谢,请问?1:0如何理解?
作者: moperyblue    时间: 2016-07-25 12:12
本帖最后由 moperyblue 于 2016-08-05 22:25 编辑
  1. awk -vRS='>' '$3=="AA"{printf RS $0}'
  2. awk '/^>/{f=$3=="AA"}f'
  3. grep -oPz '>(\S+\s+){2}AA [^>]*'|awk NF
  4. sed '/>/i \\'|sed -r '/^>(\S+\s+){2}AA\s/{:a;N;/\n$/!{$!ba};s/\n$//;p};d'
  5. sed -r ':b;/^>(\S+\s+){2}AA\s/{:a;N;/\n>/!{$q;ba};h;s/(.*)\n(.*)/\1/p;g;s//\2/;bb};d'
复制代码

作者: sunzhiguolu    时间: 2016-07-25 13:05
  1. perl -ane 'if(/>/){print if($P=$F[2] eq "AA" ? 1 : 0);next}print if($P)' f
复制代码
>H1_22 ASDSF AA BB 1111
ASDSJFKJKDJF
DSJFKDJFDJDFDFD
>SDS_22 DFD AA FDD 1111
FDSFDSFDGDG
FDFDSFDGFDGTHTYU
FDGRFHHHHHHHHHH

作者: Herowinter    时间: 2016-07-25 13:53
回复 3# tingshuibanxia

http://baike.baidu.com/link?url=fqmORbuZS4ZF9quGfaEFyrBEj7b5dNCwnHU1dAcLcA5rCM8ak-z73KwG5_NO-Rhx-ETfFrcLANzBAioebCbFma
   
作者: ll104567    时间: 2016-07-25 14:13
awk '/>/{if($3=="AA"){a=1}else{a=0}}a'
给你翻译一下那个三目运算- -
顺手摸一下5楼pp
=================================防摸pp隔离带=======================================
作者: sunzhiguolu    时间: 2016-07-25 14:59

作者: 99超人    时间: 2016-07-25 15:07
提示: 作者被禁止或删除 内容自动屏蔽
作者: 请叫我俊哥哈    时间: 2016-07-25 15:58
回复 4# moperyblue


    我想请问下,你的第三个代码,就是当匹配到/\n>/,然后保存到保存空间,然后这里的替换 s/(.*)\n(.*)/\1/  


>H1_22 ASDSF AA BB 1111
ASDSJFKJKDJF
DSJFKDJFDJDFDFD
>F2_44_3 SDKS BB DF 2323

替换成这个吗?
>H1_22 ASDSF AA BB 1111
ASDSJFKJKDJF
DSJFKDJFDJDFDFD   


作者: moperyblue    时间: 2016-07-25 16:02
回复 10# 请叫我俊哥哈


    对
作者: 我叫萌萌    时间: 2016-07-25 17:35
本帖最后由 我叫萌萌 于 2016-07-25 17:36 编辑

sed -n '/AA/,+1p'     +1p  1  代表着你的输出后几行
作者: jcdiy0601    时间: 2016-07-26 09:26
  1. awk 'BEGIN{RS=">"}{if($3=="AA")printf RS $0}' file
复制代码

作者: feiyu2994    时间: 2016-07-26 12:42
学习了,感谢分享
作者: OS_unix    时间: 2016-07-26 12:55
  1. grep -oPz '>.*AA[^>]+(?=\n)'
复制代码





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