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 개수를 제공하는 세 개의 열이 추가되도록 코드를 수정하려면 어떻게 해야 합니까?
0, NA, 1은 두 번째 행부터 계산해야 합니다. 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
.