【发布时间】:2020-08-04 01:02:36
【问题描述】:
我有一个简短的脚本可以执行我想要的操作,但是我想将该脚本应用于文件中的每一列(无论我有多少列)
输入文件(制表符分隔):
1/2:17,6:23:85:85,0,370 0/0:51,6:57:17:0,17,1359 0/0:3,0:3:9:0,9,99
0/0:3,0:3:0:.:.:0,0,38 0/0:1,0:1:3:.:.:0,3,33 0/1:1,2:3:26:0|1:13813_T_G:81,0,26
./.:2,0:2:.:.:.:0,0,0 0/0:1,0:1:3:.:.:0,3,33 0/1:1,2:3:26:0|1:13813_T_G:81,0,26
./.:0,0:0:.:0,0,0 1/1:0,4:4:12:131,12,0 ./.:0,0:0:.:0,0,0
1/1:0,2:2:6:1|1:14590_G_A:90,6,0 0/0:3,0:3:9:.:.:0,9,98 0/0:1,0:1:3:.:.:0,3,30
假设:
0/1、0/2、1/2 = HET
0/0 = ?REF
1/1, 2/2 = HOM
否则 = 未知
期望的输出(基于每列的前三个字符):
1/2:17,6:23:85:85,0,370 0/0:51,6:57:17:0,17,1359 0/0:3,0:3:9:0,9,99 HET ?REF ?REF
0/0:3,0:3:0:.:.:0,0,38 0/0:1,0:1:3:.:.:0,3,33 0/1:1,2:3:26:0|1:13813_T_G:81,0,26 ?REF ?REF HET
./.:2,0:2:.:.:.:0,0,0 0/0:1,0:1:3:.:.:0,3,33 0/1:1,2:3:26:0|1:13813_T_G:81,0,26 unknown ?REF HET
./.:0,0:0:.:0,0,0 1/1:0,4:4:12:131,12,0 ./.:0,0:0:.:0,0,0 unknown HOM unknown
1/1:0,2:2:6:1|1:14590_G_A:90,6,0 0/0:3,0:3:9:.:.:0,9,98 0/0:1,0:1:3:.:.:0,3,30 HOM ?REF ?REF
我编写了一个脚本,它获取第一列并吐出正确的 HET/?REF/HOM/unknown:
awk 'BEGIN{FS=OFS="\t"}{if(($1 ~ /0\/1/) || ($1 ~ /1\/2/) || ($1 ~ /0\/2/)) print $1,"HET"; \
else if(($1 ~ /1\/1/) || ($1 ~ /2\/2/)) print $1,"HOM"; \
else if($1 ~ /0\/0/) print $1,"?REF"; \
else print $1,"unknown";}' inputfile
这给了我以下信息:
1/2:17,6:23:85:85,0,370 HET
0/0:3,0:3:0:.:.:0,0,38 ?REF
./.:2,0:2:.:.:.:0,0,0 unknown
./.:0,0:0:.:0,0,0 unknown
1/1:0,2:2:6:1|1:14590_G_A:90,6,0 HOM
到目前为止一切顺利。现在,我想使用上面的脚本遍历每一列,然后按如下所示的顺序打印正确的 REF/HET/HOM,即 genotype1 匹配 coded1 和 genotype2 匹配 coded2 等。
genotype1 genotype2 genotype3 coded1 coded2 coded3
1/2:17,6:23:85:85,0,370 0/0:51,6:57:17:0,17,1359 0/0:3,0:3:9:0,9,99 HET ?REF ?REF
这就是我被卡住的地方,我害怕!我不确定如何遍历每一列...
请放轻松,我是临床医生而不是生物信息学家! E
【问题讨论】:
-
遍历列,可以使用
for(i=1;i<=NF;i++) {... },其中NF是字段数。
标签: awk