在同一行上的两个模式匹配之间打印

时间:2015-02-13 12:14:02

标签: regex awk pattern-matching

我有一个如下所示的文件。我想打印第一,第二,第三,第四和第五列,然后拆分第八列并在“EFF =”和下面的“(”之间打印,并在分割管道之间的第八列之后打印“| “打印第六场比赛。

chr1    10150   .   C   T   6.72    .   DP=6;VDB=0.0074;AF1=0.2932;CLR=6;AC1=1;DP4=3,1,1,1;MQ=30;FQ=7.98;PV4=1,0.33,1,0.22;EFF=DOWNSTREAM(MODIFIER||4212|||WASH7P||NON_CODING|NR_024540.1||1),INTERGENIC(MODIFIER||||||||||1),UPSTREAM(MODIFIER||1724|||DDX11L1||NON_CODING|NR_046018.2||1) GT:PL:DP:SP:GQ  0/0:0,6,26:2:0:9    0/1:38,0,48:4:0:36
chr1    10291   .   C   T   3.55    .   DP=1;AF1=1;AC1=4;DP4=0,0,1,0;MQ=52;FQ=-27.4;EFF=DOWNSTREAM(MODIFIER||4071|||WASH7P||NON_CODING|NR_024540.1||1),INTERGENIC(MODIFIER||||||||||1),UPSTREAM(MODIFIER||1583|||DDX11L1||NON_CODING|NR_046018.2||1)    GT:PL:DP:SP:GQ  0/1:0,0,0:0:0:3 0/1:31,3,0:1:0:5
chr1    10297   .   C   T   3.55    .   DP=1;AF1=1;AC1=4;DP4=0,0,1,0;MQ=52;FQ=-27.4;EFF=DOWNSTREAM(MODIFIER||4065|||WASH7P||NON_CODING|NR_024540.1||1),INTERGENIC(MODIFIER||||||||||1),UPSTREAM(MODIFIER||1577|||DDX11L1||NON_CODING|NR_046018.2||1)    GT:PL:DP:SP:GQ  0/1:0,0,0:0:0:3 0/1:31,3,0:1:0:5
chr1    10327   .   T   C   3.02    .   DP=3;VDB=0.0160;AF1=1;AC1=4;DP4=0,0,1,0;MQ=56;FQ=-27.4;EFF=DOWNSTREAM(MODIFIER||4035|||WASH7P||NON_CODING|NR_024540.1||1),INTERGENIC(MODIFIER||||||||||1),UPSTREAM(MODIFIER||1547|||DDX11L1||NON_CODING|NR_046018.2||1) GT:PL:DP:SP:GQ  0/1:30,3,0:1:0:5    0/0:0,0,0:0:0:3

输出

chr1    10150   .   C   T WASH7P DOWNSTREAM
chr1    10291   .   C   T WASH7P DOWNSTREAM
chr1    10297   .   C   T WASH7P DOWNSTREAM
chr1    10327   .   T   C WASH7P DOWNSTREAM

我可以在管道“|”之间的第八列上打印列和第六个元素使用以下,但不是“EFF =”和下一个“(”。

之间匹配的字符串
awk '{split($8,a,"|"); print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $5 "\t" a[6] "\t" a[8]}'

2 个答案:

答案 0 :(得分:1)

您可以使用使用正则表达式的match()EFF匹配到开括号。它在eff变量中返回值EFF=DOWNSTREAM,然后使用substr()提取等号和左括号之间的字符串,如:

awk '
    {split($8,a,"|"); 
    match($8, "EFF=[^(]*", eff); 
    print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $5 "\t" a[6] "\t" substr(eff[0], 5)}
' infile

它产生:

chr1    10150   .       C       T       WASH7P  DOWNSTREAM
chr1    10291   .       C       T       WASH7P  DOWNSTREAM
chr1    10297   .       C       T       WASH7P  DOWNSTREAM
chr1    10327   .       T       C       WASH7P  DOWNSTREAM

更新:您使用的是awk的旧版本(或至少非GNU版本)。 match()函数只接受两个参数,因此您必须使用RSTARTRLENGTH变量,请尝试以下版本:

awk '
    {split($8,a,"|"); 
    pos = match($8, "EFF=[^(]*"); 
    print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $5 "\t" a[6] "\t" substr($8, RSTART + 4, RLENGTH - 4)}
' infile

结果与之前的结果相同。

答案 1 :(得分:0)

$ cat tst.awk
{
    split($8,a,/[|(]|EFF=/)
    print $1, $2, $3, $4, $5, a[8], a[2]
}

$ awk -f tst.awk file
chr1 10150 . C T WASH7P DOWNSTREAM
chr1 10291 . C T WASH7P DOWNSTREAM
chr1 10297 . C T WASH7P DOWNSTREAM
chr1 10327 . T C WASH7P DOWNSTREAM