我有一堆基因型文件基因型-HA1_1,...,基因型-HA1_27。行是 SNP,列是个体。每个基因型文件中个体的数量(即列)不同。以下是它们的 2 个示例:
head genotype-HA1_1
A A A A A A A A A A
C C C C C C C N C C
N K K K T K K N G N
N A A A R A A A A A
Y Y T Y C T Y T T Y
和
head genotype-HA1_11
A A W A A W A A A N A
C C C C C C C N C C C
G G K G N K K N G G G
A A A A N A A N A A A
我想计算每个 SNP 的字符“N”总数,并将其除以循环中每个文件中的个体(即列)数。
我想要的输出
count-genotype-HA1_1
0
0.1
0.3
0.1
0
我正在使用这样的东西
for cfile in genotype-HA1_*; do
awk -F\N '{print NF-1/NF}' "$cfile" > count-"${cfile##*.}"; done
计算“N”数量的代码部分工作得很好,我只是不知道如何将其划分为每个文件中的列数。
答案1
与其使用 N 作为字段分隔符,为什么不使用默认的空格分隔符以使其NF
具有常规解释(即列数),并使用 的返回值来对 sgsub
进行计数N
?
$ awk '{print gsub("N","N")/NF}' genotype-HA1_1
0
0.1
0.3
0.1
0
注意:gsub("N","N")
计算记录(行)中字符的出现次数N
,这通常与相等的字段数不同N
(尽管在示例输入中这些是相同的)。如果您需要更严格的定义,那么 KISS 方法将类似于:
awk '{c = 0; for(i=1;i<=NF;i++) c += ($i == "N"); print c/NF}' genotype-HA1_1