Zählen und drucken Sie die Häufigkeit von „0“, „1“ und „NA“ in jeder Zeile nach der Kopfzeile.

Zählen und drucken Sie die Häufigkeit von „0“, „1“ und „NA“ in jeder Zeile nach der Kopfzeile.
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

Folgendes habe ich versucht, die Häufigkeit von '0' und '1' zu ermitteln.

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

Mein Code gibt nicht die richtige Ausgabe aus

Wie kann ich meinen Code korrigieren, sodass am Ende meiner Ausgabedatei drei Spalten hinzugefügt werden, die mir die Anzahl 0, 1 und NA liefern?

0, NA und 1 müssen ab der zweiten Zeile gezählt werden. In den Spalten 0, NA und 1 müssen ab der siebten Spalte gezählt werden

Gewünschte Ausgabe:

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

Antwort1

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

NAsVariable zählt das Vorkommen von „NA“.
onesVariable zählt das Vorkommen von „1“.
totalZählt die insgesamt besuchten Felder vom siebten bis letzten Feld (dies könnte entfernt werden, aber ich habe der Übersichtlichkeit halber * verwendet ).
total-ones-NAsIst die Anzahl der „0“ (durch Subtraktion von Einsen und NAs von der Gesamtzahl). NAs=ones=total=0Setzt die Variablen für die nächste Zeile zurück.


*: wir könnten es entfernen total++und total-ones-NAsdurch ersetzen NF-6-ones-NAs.

verwandte Informationen