Как перебирать столбцы в awk - PullRequest
       53

Как перебирать столбцы в awk

0 голосов
/ 03 августа 2020

У меня есть короткий сценарий, который делает то, что я хочу, однако я хочу применить сценарий к каждому столбцу в файле (независимо от того, сколько столбцов у меня есть)

Входной файл (с разделителями табуляции):

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

else = unknown

Желаемый результат (на основе первых трех символов каждого столбца):

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 в последовательном порядке, как показано ниже, т.е. генотип1 соответствует coded1, а генотип2 соответствует coded2 et c.

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

Боюсь, здесь я застреваю! Я не уверен, как пропустить oop через каждую колонку ...

Пожалуйста, go полегче, я клиницист, а не биоинформатик! E

1 Ответ

1 голос
/ 03 августа 2020

здесь немного другой подход, может быть проще поддерживать

$ awk 'BEGIN {FS=OFS="\t"
              map["0/1"]=map["1/2"]=map["0/2"]="HET"
              map["1/1"]=map["2/2"]="HOM"
              map["0/0"]="?REF"}

       NR==1 {print; next}  # if you have a header, if not remove
             {printf "%s", $0
              for(i=1;i<=NF;i++) {
                  t=substr($i,1,3);
                  printf "%s", OFS (t in map?map[t]:"unknown")}
              print ""}' file


             
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...