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

print between two pattern matches on same line

我有一个如下所示的文件。我想打印第一列、第二列、第三列、第四列和第五列,然后拆分第八列并在 "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(,a,"|"); print  "\t"  "\t"  "\t"  "\t"  "\t" a[6] "\t" a[8]}'

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

awk '
    {split(,a,"|"); 
    match(, "EFF=[^(]*", eff); 
    print  "\t"  "\t"  "\t"  "\t"  "\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(,a,"|"); 
    pos = match(, "EFF=[^(]*"); 
    print  "\t"  "\t"  "\t"  "\t"  "\t" a[6] "\t" substr(, RSTART + 4, RLENGTH - 4)}
' infile

结果和上一个一样

$ cat tst.awk
{
    split(,a,/[|(]|EFF=/)
    print , , , , , 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