遺伝子型ファイル 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