2016-07-31 11 views
1

Ich würde etwas Hilfe mit einem awk-Skript oder was auch immer die Arbeit tun würde.AWK (oder etwas anderes) Durchschnitt mehrerer Spalten aus mehreren Dateien

Also, ich habe mehrere Dateien (die gleiche Anzahl von Zeilen und Spalten) und ich möchte einen Durchschnitt von jeder Zahl in jeder Spalte (außer dem ersten) aus allen Dateien machen. Ich habe keine Ahnung, wie viele Spalten es in einer Datei gibt (obwohl ich wahrscheinlich die Nummer bekommen könnte, wenn nötig).

filename.1

1 1 2 3 4 
2 3 4 5 6 
3 2 3 5 6 

filename.2

1 3 4 6 6 
2 5 6 7 8 
3 4 5 7 8 

Ausgang

1 2 3 5 5 
2 4 5 6 7 
3 3 4 6 7 

ich diese irgendwo hier gefunden haben, dass es für eine einzelne Spalte tut (so weit wie ich es verstehe

awk '{a[FNR]+=$2;b[FNR]++;}END{for(i=1;i<=FNR;i++)print i,a[i]/b[i];}' fort.* 

Also das einzige? Änderung wäre, das + = $ 2 durch einen Zyklus über alle Spalten zu ersetzen? Gibt es eine Möglichkeit, dies zu tun, ohne die genaue Anzahl der Spalten zu kennen?

Danke.

Antwort

4
$ cat tst.awk 
{ 
    key[FNR] = $1 
    for (colNr=2; colNr<=NF; colNr++) { 
     sum[FNR,colNr] += $colNr 
    } 
} 
END { 
    for (rowNr=1; rowNr<=FNR; rowNr++) { 
     printf "%s%s", key[rowNr], OFS 
     for (colNr=2; colNr<=NF; colNr++) { 
      printf "%s%s", int(sum[rowNr,colNr]/ARGIND+0.5), (colNr<NF ? OFS : ORS) 
     } 
    } 
} 

$ awk -f tst.awk file1 file2 
1 2 3 5 5 
2 4 5 6 7 
3 3 4 6 7 

Die oben verwendet GNU awk für ARGIND, mit anderen awks eine Linie FNR==1{ARGIND++} zu Beginn nur hinzufügen.

+1

Danke, das macht den Trick. –

+0

Ha, ich bin überrascht, dass dies tatsächlich für das mitgelieferte Beispiel funktioniert, da ich entdeckt habe, dass ich einen Fehler in file.2 gemacht habe. Nach der Korrektur gibt es nur sum [rowNr, colNr]/ARGIND, um die richtigen Ergebnisse für die reelle Zahl zu erhalten. Prost. –

0

a[FNR]+=$2 Ersetzen von

for(i=2;i<=NF;i++) { a[FNR] += $i; } 

NF die Anzahl der Felder ist