Перебор комбинаций выбранных строк в определенных столбцах и подсчет их встречаемости

#awk

Вопрос:

У меня есть

 A 34 missense fixed
A 33 synonymous fixed
B 12 synonymous var
B 34 missense fixed
B 34 UTR fixed
B 45 missense var
TRI 4 synonymous var
TRI 4 intronic var
3 3 synonymous fixed
 

Я хочу вывести количество комбинаций missense amp;amp; fixed, missense amp;amp; var, синонимичных amp;amp; фиксированных, синонимичных amp;amp; var для каждого элемента в 1 долл.

    missensefixed  missensevar synonymousfixed synonymousvar
A  1              0           1               0
B  1              1           0               0  
TRI 0             0           0               1
3  0              0           1               0
 

Я могу сделать это с помощью 4 отдельных команд, выбирающих для каждой комбинации и объединяющих выходные данные

 awk  -F't' '($3~/missense/ amp;amp; $4~/fixed/)' file | awk -F't' '{count[$1"t"$3"t"$4]  } END {for (word in count) print word"t"count[word]}' > out
 

Но я хотел бы сделать это для всех комбинаций сразу. Я пробовал некоторые варианты этого, но не смог заставить это работать

  awk print a[i] -v delim=":" -v string='missense:synonymous:fixed:var'  'BEGIN {n = split(string, a, delim); for (i = 1; i <= n-2;   i) {count[xxxx}  }} END ;for (word in count) print word"t"count[word]}
 

Ответ №1:

Вы можете использовать это awk с несколькими массивами для хранения разных подсчетов:

 awk -v OFS='t' '
{keys[$1]}
/missense fixed/ {  mf[$1]}
/missense var/ {  mv[$1]}
/synonymous fixed/ {  sf[$1]}
/synonymous var/ {  sv[$1]}
END {
   print "-tmissensefixedtmissensevartsynonymousfixedtsynonymousvar"
   for (i in keys)
      print i, mf[i] 0, mv[i] 0, sf[i] 0, sv[i] 0
}
' file | column -t

-    missensefixed  missensevar  synonymousfixed  synonymousvar
A    1              0            1                0
B    1              1            0                1
TRI  0              0            0                1
3    0              0            1                0
 

Я использовал column -t только для табличного вывода.

Комментарии:

1. Спасибо! Проверено и работает! Мне действительно нравится, как мне просто нужно указать строки и ключевой столбец, и я могу подсчитать любой вариант в соответствии с любым ключом, независимо от того, в каких столбцах они отображаются.

Ответ №2:

GNU awk поддерживает массивы массивов, поэтому, если это ваш awk , вы можете подсчитать свои записи с помощью чего-то такого простого, как num[$1][$3$4] . Самая сложная часть-это окончательная печать, удобная для человека:

 $ cat foo.awk
{ num[$1][$3$4]   }
END {
  printf("    missensefixed missensevar synonymousfixed synonymousvarn");
  for(r in num) printf("%3sddddn", r, num[r]["missensefixed"],
    num[r]["missensevar"], num[r]["synonymousfixed"], num[r]["synonymousvar"])}

$ awk -f foo.awk data.txt
    missensefixed missensevar synonymousfixed synonymousvar
  A             1           0               1             0
  B             1           1               0             1
TRI             0           0               0             1
  3             0           0               1             0
 

Ответ №3:

Использование любого awk в любой оболочке в каждом окне Unix с помощью функции » от column » для преобразования вывода awk, разделенного вкладками, в визуальное табличное отображение, если вы этого хотите:

 $ cat tst.awk
BEGIN {
    OFS = "t"
    numTags = split("missensefixed  missensevar synonymousfixed synonymousvar",tags)
}
{
    keys[$1]
    cnt[$1,$3 $4]  
}
END {
    for (tagNr=1; tagNr<=numTags; tagNr  ) {
        tag = tags[tagNr]
        printf "%s%s", OFS, tag
    }
    print ""
    for (key in keys) {
        printf "%s", key
        for (tagNr=1; tagNr<=numTags; tagNr  ) {
            tag = tags[tagNr]
            val = cnt[key,tag]
            printf "%s%d", OFS, val
        }
        print ""
    }
}
 
 $ awk -f tst.awk file
        missensefixed   missensevar     synonymousfixed synonymousvar
A       1       0       1       0
B       1       1       0       1
TRI     0       0       0       1
3       0       0       1       0
 
 $ awk -f tst.awk file | column -s

Я настоятельно рекомендую вам всегда дадут каждого столбца заголовка строки, хотя так это не делает дальнейшую обработку данных сложнее (например, значение его в Excel и сортировки заголовков), поэтому если бы я был тобой, я бы добавить  printf "key"   или что-то другое, что более точно определяет, что содержимое столбцов в качестве первой строки в конец раздела (т. е. на линии непосредственно перед первой  for   петлей), поэтому первый столбец получает заголовке:

 $ awk -f tst.awk file | column -s


Комментарии:

1. Спасибо! Протестировано и работает, и мне нравится, что оно менее жестко закодировано. Просто нужно указать строки и столбцы и могу посчитать любой тип варианта, который мне нужен.

t' -t
missensefixed missensevar synonymousfixed synonymousvar
A 1 0 1 0
B 1 1 0 1
TRI 0 0 0 1
3 0 0 1 0
Я настоятельно рекомендую вам всегда дадут каждого столбца заголовка строки, хотя так это не делает дальнейшую обработку данных сложнее (например, значение его в Excel и сортировки заголовков), поэтому если бы я был тобой, я бы добавить printf "key" или что-то другое, что более точно определяет, что содержимое столбцов в качестве первой строки в конец раздела (т. е. на линии непосредственно перед первой for петлей), поэтому первый столбец получает заголовке:


Комментарии:

1. Спасибо! Протестировано и работает, и мне нравится, что оно менее жестко закодировано. Просто нужно указать строки и столбцы и могу посчитать любой тип варианта, который мне нужен.

t' -t
key missensefixed missensevar synonymousfixed synonymousvar
A 1 0 1 0
B 1 1 0 1
TRI 0 0 0 1
3 0 0 1 0

Комментарии:

1. Спасибо! Протестировано и работает, и мне нравится, что оно менее жестко закодировано. Просто нужно указать строки и столбцы и могу посчитать любой тип варианта, который мне нужен.

t’ -t
missensefixed missensevar synonymousfixed synonymousvar
A 1 0 1 0
B 1 1 0 1
TRI 0 0 0 1
3 0 0 1 0

Я настоятельно рекомендую вам всегда дадут каждого столбца заголовка строки, хотя так это не делает дальнейшую обработку данных сложнее (например, значение его в Excel и сортировки заголовков), поэтому если бы я был тобой, я бы добавить printf "key" или что-то другое, что более точно определяет, что содержимое столбцов в качестве первой строки в конец раздела (т. е. на линии непосредственно перед первой for петлей), поэтому первый столбец получает заголовке:


Комментарии:

1. Спасибо! Протестировано и работает, и мне нравится, что оно менее жестко закодировано. Просто нужно указать строки и столбцы и могу посчитать любой тип варианта, который мне нужен.