#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. Спасибо! Протестировано и работает, и мне нравится, что оно менее жестко закодировано. Просто нужно указать строки и столбцы и могу посчитать любой тип варианта, который мне нужен.