在同一行的两个模式匹配之间打印
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()
函数只接受两个参数,所以你必须使用 RSTART
和 RLENGTH
变量,试试这个版本:
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
我有一个如下所示的文件。我想打印第一列、第二列、第三列、第四列和第五列,然后拆分第八列并在 "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()
函数只接受两个参数,所以你必须使用 RSTART
和 RLENGTH
变量,试试这个版本:
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