подсчитать и вывести частоту «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 необходимо подсчитать в седьмом столбце и далее.

Желаемый результат:

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».
totalподсчитывает общее количество посещенных полей, начиная с 7- го с конца (его можно было бы удалить, но я использовал для ясности * ).
total-ones-NAs— это количество «0» (путем вычитания единиц и NA из общего количества). NAs=ones=total=0сбрасывает переменные для следующей строки.


*: мы могли бы удалить total++и заменить total-ones-NAsна NF-6-ones-NAs.

Связанный контент