计算每行中的一个字符并将其划分为列数

计算每行中的一个字符并将其划分为列数

我有一堆基因型文件基因型-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

相关内容