헤더 행 뒤의 각 행에서 "0", "1", "NA"의 빈도를 계산하여 인쇄합니다.

헤더 행 뒤의 각 행에서 "0", "1", "NA"의 빈도를 계산하여 인쇄합니다.
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번째 필드에서 방문한 필드의 총 개수를 셉니다 (이것은 제거할 수 있지만 명확성 을 위해 *를 사용했습니다 ) . "0"의 수입니다(전체에서 "0"과 "NA"를 뺀 값). 다음 줄에서 변수를 재설정합니다.
total
total-ones-NAsNAs=ones=total=0


*: 삭제 total++하고 total-ones-NAs로 대체할 수 있습니다 NF-6-ones-NAs.

관련 정보