2015-01-26 89 views
0

我有文件看起来像这样AWK - 打印特定模式

gene_id_100100 sp|Q53IZ1|ASDP_PSESP 35.81 148 90 2 13 158 6 150 6e-27 109 158 531 
gene_id_100600 sp|Q49W80|Y1834_STAS1 31.31 99 63 2 1 95 279 376 7e-07 50.1 113 402 
gene_id_100  sp|A7TSV7|PAN1_VANPO 36.36 44 24 1 41 80 879 922 1.9 32.3 154 1492 
gene_id_10100 sp|P37348|YECE_ECOLI 32.77 177 104 6 3 172 2 170 2e-13 71.2 248 272 
gene_id_101100 sp|B0U4U5|SURE_XYLFM 29.11 79 41 3 70 148 143 206 0.14 35.8 175 262 
gene_id_101600 sp|Q5AWD4|BGLM_EMENI 35.90 39 25 0 21 59 506 544 4.9 30.4 129 772 
gene_id_102100 sp|P20374|COX1_APILI 38.89 36 22 0 3 38 353 388 0.54 32.0 92 521 
gene_id_102600 sp|Q46127|SYW_CLOLO  79.12 91 19 0 1 91 1 91 5e-44 150 92 341 
gene_id_103100 sp|Q9UJX6|ANC2_HUMAN 53.57 28 13 0 11 38 608 635 2.1 28.9 42 822 
gene_id_103600 sp|C1DA02|SYL_LARHH  35.59 59 30 2 88 138 382 440 4.6 30.8 140 866 
gene_id_104100 sp|B8DHP2|PROB_LISMH 25.88 85 50 2 37 110 27 109 0.81 32.3 127 276 
gene_id_105100 sp|A1ALU1|RL3_PELPD  31.88 69 42 2 14 77 42 110 2.2 31.6 166 209 
gene_id_105600 sp|P59696|T200_SALTY 64.00 125 45 0 5 129 3 127 9e-58 182 129 152 
gene_id_10600 sp|G3XDA3|CTPH_PSEAE 28.38 74 48 1 4 77 364 432 0.56 31.6 81 568 
gene_id_106100 sp|P94369|YXLA_BACSU 35.00 100 56 3 25 120 270 364 4e-08 53.9 120 457 
gene_id_106600 sp|P34706|SDC3_CAEEL 60.00 20 8 0 18 37 1027 1046 2.3 32.7 191 2150 

现在,我需要提取基因ID,这是||之间的一个在第二列。换句话说,我需要的输出,看起来像这样:

Q53IZ1 
Q49W80 
A7TSV7 
P37348 
B0U4U5 
Q5AWD4 
P20374 
Q46127 
Q9UJX6 
C1DA02 
B8DHP2 
A1ALU1 
P59696 
G3XDA3 
P94369 
P34706 

我一直在尝试使用下面的命令来做到这一点:

awk '{for(i=1;i<=NF;++i){ if($i==/[A-Z][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9]/){print $i} } }' 

,但它似乎并没有工作。

回答

2

模式匹配并不是必须的。我建议

awk -F\| '{print $2}' filename 

这分裂行成| -delimited领域和打印他们的第二位。

或者,

cut -d\| -f 2 filename 

达到相同。

+0

哇,完美的工作!而且它看起来也很简单,不像我试图用哈哈的那段代码。非常感谢您的帮助,当限制关闭时,我会在9分钟内接受您的答案。你是一个拯救生命的人。 – MPR6 2015-01-26 22:03:37

+0

虽然如果你有时间,你能告诉我为什么我使用的命令不起作用吗? – MPR6 2015-01-26 22:06:00

+1

嗯,从哪里开始。那么,首先,就awk而言,'|'之间的东西不是一个字段,因为它的缺省字段分隔符是一个空白序列。第一行的'$ 2'是代码中的'sp | Q53IZ1 | ASDP_PSESP'。其次,你使用比较运算符'=='而不是正则表达式匹配运算符'〜',这与正则表达式没有太大关系。我不认为它的作用是定义的; gawk似乎在做数值转换(?)。如果您使用过'〜',那么您将打印出包含匹配的字段,而不是匹配本身。 – Wintermute 2015-01-26 22:17:11