首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >unix:计数每个基因具有两个变体或一个纯合子变体的样本

unix:计数每个基因具有两个变体或一个纯合子变体的样本
EN

Stack Overflow用户
提问于 2013-07-03 04:17:21
回答 2查看 100关注 0票数 0

除了我有限的unix power工具技能之外,我还有一个编码问题。我希望通过以下两种方法来计算样本数量: i)基因中的纯合子变体(如下所示);或者ii)基因中的两个变体(2xAB)。例如,来自:

代码语言:javascript
复制
Variant Gene    Sample1 Sample2 Sample3
   1    TP53    AA  BB  AB
   2    TP53    AB  AA  AB
   3    TP53    AB  AA  AA
   4    KRAS    AA  AB  AA
   5    KRAS    AB  AB  BB

我要找的是:

代码语言:javascript
复制
Gene Two_variants Homozygous Either
TP53     2            1        3
KRAS     1            1        2 

任何帮助都将不胜感激。谢谢。

R_G

EN

回答 2

Stack Overflow用户

发布于 2013-07-03 06:03:38

GNU awk

代码语言:javascript
复制
awk '/\<AB\>.+\<AB\>/ { arr[$2,"AB"] += 1 }
             /\<BB\>/ { arr[$2,"BB"] += 1 }
                  END { for ( elt in arr ) {
                          split ( elt, index_parts, SUBSEP )
                          genes[index_parts[1]] = 0
                        }
                        printf "%4s%13s%11s%7s\n", "Gene", "Two_variants", "Homozygous", "Either"
                        for ( gene in genes ) {
                          printf "%4s%6d%13d%9d\n", gene, arr[gene,"AB"], arr[gene,"BB"], arr[gene,"AB"] + arr[gene,"BB"]
                        }
                      }' input.txt
票数 1
EN

Stack Overflow用户

发布于 2013-07-03 08:25:04

代码语言:javascript
复制
use warnings;
use strict;
my (@header, %data);
open(my $file, "<", "input") or die("$?");
while (<$file>) {
    @header = split, next if not @header;
    my @v = split;
    $data{$v[1]}->{$_}++ for (@v[2..$#v]);
}
close $file;
print "Gene Two_variants Homozygous Either\n";
for my $k (keys %data) {
    my ($var2, $homoz) = (int($data{$k}{AB}/2), $data{$k}{BB});
    my $sum = $var2 + $homoz;
    printf("%4s %8d %9d %8d\n", $k, $var2, $homoz, $sum) if $sum;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17435099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档