Chr start stop superfamily TE pres/abs 88 108 139 159 265 350 351 403 410 424 428 430 506 544 546 6
1 8667 8700 MuDR ATDNAI27T9A presence NA 0 0 0 0 0 0 0 0 0 0 NA 0 0 0 0
1 10585 10600 Gypsy ATHILA6A presence NA 0 0 0 0 NA 0 0 0 0 0 0 0 0 0 0
1 15091 15099 Copia ATCOPIA13 presence 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 15894 15898 Gypsy ATGP1 presence 0 0 NA 0 NA 0 0 0 0 0 1 0 0 0 0 NA 1
1 20514 20532 MuDR VANDAL8 presence NA 0 NA NA NA NA NA 1 0 NA NA NA 0 0 0 NA NA
1 20530 20537 Gypsy ATGP1 presence NA 0 0 NA NA NA NA 1 0 NA NA NA 0 0 0 NA NA
以下は「0」と「1」の頻度を取得するために試したものです
cat file.bed|awk '{if(NR>1){for (i = 1; i <= NF; i++) if($i==0)print}}'|awk '{count=0;if(NR==1){print $0"\tcount"}else{for (i=8; i<=NF; i++){if ($i==1){count++}}print $0"\t"count}}' > x
コードが正しい出力を返さない
出力ファイルの最後に 0、1、NA のカウントを示す 3 つの列が追加されるようにコードを修正するにはどうすればよいですか?
0、NA、1は2行目以降にカウントする必要があります。列0、NA、1は7列目以降にカウントする必要があります。
望ましい出力:
Chr start stop superfamily TE pres/abs 88 108 139 159 265 350 351 403 410 424 428 430 506 544 546 6 count0 count1 countNA freq0 freq1 freqNA
1 8667 8700 MuDR ATDNAI27T9A presence NA 0 0 0 0 0 0 0 0 0 0 NA 0 0 0 0 14 0 2 0.87 0 0.12
答え1
awk 'BEGIN{ FS=OFS="\t" }
NR==1 { print $0, "0s", "1s", "NAs" }
NR>1 { for(i=7; i<=NF; i++) { NAs+=$i=="NA"; ones+=$i==1; total++ };
print $0, total-ones-NAs, ones, NAs; NAs=ones=total=0;
}' infile >outfile
NAs
変数は「NA」の出現回数をカウントします。
ones
変数は「1」の出現回数をカウントします。最後の 7番目
total
のフィールドからアクセスされたフィールドの合計をカウントします(これは削除できますが、わかりやすくするために*を使用しました)。は「0」の数です (合計から 1 と NA を減算します)。 次の行の変数をリセットします。
total-ones-NAs
NAs=ones=total=0
*: を削除して にtotal++
置き換えることができます。total-ones-NAs
NF-6-ones-NAs