conta um caractere em cada linha e divide-o no número de colunas

0

Eu tenho um monte de arquivos genotípicos genotype-HA1_1, ..., genotype-HA1_27. As linhas são SNPs e as colunas são individuais. O número de indivíduos (isto é, colunas) difere em cada arquivo de genótipo. Veja dois exemplos de como eles se parecem:

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

e

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

Eu quero contar o número total de caracteres "N" para cada SNP e dividi-lo pelo número de indivíduos (ou seja, colunas) em cada arquivo em um loop.

minha saída desejada

count-genotype-HA1_1
0
0.1
0.3
0.1
0

Estou usando algo assim

for cfile in genotype-HA1_*; do
awk -F\N '{print NF-1/NF}' "$cfile" > count-"${cfile##*.}"; done

parte do código que conta o número de "N" funciona perfeitamente, eu não sei como dividi-lo no número de colunas em cada arquivo.

    
por Anna1364 09.11.2017 / 00:05

1 resposta

3

Em vez de usar N como separador de campos, por que não usar o separador de espaços em branco padrão de tal forma que NF tenha sua interpretação convencional (ou seja, o número de colunas) e use o valor de retorno de gsub para contar N s?

$ awk '{print gsub("N","N")/NF}' genotype-HA1_1 
0
0.1
0.3
0.1
0

NOTA: gsub("N","N") conta as ocorrências do caractere N no registro (linha), que geralmente não é o mesmo que o número de campos que são iguais a N (embora na sua entrada de amostra sejam iguais ). Se você precisa de uma definição mais rígida, então uma abordagem do KISS seria algo como:

awk '{c = 0; for(i=1;i<=NF;i++) c += ($i == "N"); print c/NF}' genotype-HA1_1
    
por 09.11.2017 / 00:21