各行で 1 文字を数えて列数で割ります。

各行で 1 文字を数えて列数で割ります。

遺伝子型ファイル genotype-HA1_1,..., genotype-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解釈(列数など)を取得し、sの戻り値を使用してsをgsub計算するのはどうですか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

関連情報