用bash在一行上说一句话

时间:2016-08-21 23:57:50

标签: bash unix awk grep

我是用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

1 个答案:

答案 0 :(得分:1)

使用awk

$ 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

$ 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打印生成的行。