我是用bash写东西的新手,我需要在文档的行中提取以PVX_ *开头的单词,但只有在以粗体显示的单词之后。但我不知道该怎么做。 我知道这个问题一定听起来很愚蠢...... 结果必须是此PVX _ *
的列表Chromosome_1.1 43305 . A G 689 PASS AC=2;AF=1.00;AN=2;DP=21;Dels=0.00;EFF=DOWNSTREAM(MODIFIER||2492|||PVX_087695|PV_SaI_1_GB_ORFS_1||PVX_087695A||1),DOWNSTREAM(MODIFIER||3976|||PVX_087690|PV_SaI_1_GB_ORFS_1||PVX_087690A||1),**NON_SYNONYMOUS_CODING**(MODERATE|MISSENSE|cTa/cCa|L883P||**PVX_087700**|PV_SaI_1_GB_ORFS_1||PVX_087700A|1|1),UPSTREAM(MODIFIER||4300|||PVX_087705|PV_SaI_1_GB_ORFS_1||PVX_087705A||1);FS=0.000;HaplotypeScore=0.0000;MLEAC=1;MLEAF=1.00;MQ=41.72;MQ0=0;QD=32.81;SOR=1.402;set=variant GT 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 1|1
Chromosome_1.1 45318 . C A 1432.77 PASS AC=4;AF=1.00;AN=4;DP=72;Dels=0.00;EFF=**NON_SYNONYMOUS_CODING**(MODERATE|MISSENSE|aGa/aTa|R212I||**PVX_087700**|PV_SaI_1_GB_ORFS_1||PVX_087700A|1|1);FS=0.000;MLEAC=2;MLEAF=1.00;MQ0=0;set=variant6-variant10 GT 0|0 0|0 0|0 0|0 0|0 1|1 0|0 0|0 0|0 0|0 1|1 0|0 0|0
答案 0 :(得分:1)
$ awk -F\| '{for (i=1;i<=NF;i++)if ($i~/NON_SYNONYMOUS_CODING/)print $(i+5)}' file
PVX_087700
PVX_087700
-F\|
告诉awk使用|
作为字段分隔符将行划分为字段。然后代码查找包含NON_SYNONYMOUS_CODING
的任何字段,并且一旦找到,它就会在此字段之后打印第六个字段的内容。
$ sed -En 's/.*NON_SYNONYMOUS_CODING([^|]*[|]){5}(PVX_[^|]*).*/\2/p' file
PVX_087700
PVX_087700
-E
这告诉sed使用扩展正则表达式。
-n
除非我们明确要求,否则告诉sed不要打印任何内容。
s/.*NON_SYNONYMOUS_CODING([^|]*[|]){5}(PVX_[^|]*).*/\2/p
这会查找跟随NON_SYNONYMOUS_CODING
的行,后面是PVX_something的5个竖线。这只用PVX_something部分替换整行。
如果执行了替换,意味着如果NON_SYNONYMOUS_CODING
出现在PVX_something之前的第5行|
,那么p
会告诉sed打印生成的行。