2016-12-20 5 views
1

So habe ich eine Datei, die wie folgt aussieht:Summenwerte von bestimmten Spalten mit awk

1 4 6 
2 5 
3 

ich nur bestimmte Spalten summieren möchten, lassen Sie sich den ersten sagen und dritter. Und die Ausgabe sollte wie folgt aussehen:

7 
2 
3 

Ich speichere Anzahl von Spalten (Argumenten) in einer Variablen: x=${@:2}

(weil ich weglassen erstes Argument übergeben, die ein $filename ist) Wie berechnet man das mit awk in einem Bash-Skript? Ich dachte über etw wie diese

for i in ${@:2} 
do 
    awk -v c=$i '{sum+=$c;print sum}' $fname 

done 

Aber es funktioniert nicht richtig.

Antwort

4

Wie wäre es etwa so:

$ awk -v c="1 3" 'BEGIN{split(c,a)}{c=0;for(i in a) c+=$a[i]; print c}' file 
7 
2 
3 

Erklärt:

$ awk -v c="1 3" ' # the desired column list space-separated 
BEGIN { 
    split(c,a)  # if not space-separated, change it here 
} 
{ 
    c=0;   # reusing col var as count var. recycle or die! 
    for(i in a)  # after split desired cols are in a arr, ie. a[1]=1, a[2]=3 
     c+=$a[i]; # sum'em 
    print c   # print it 
}' file 

EDIT: geändert durch Komma Trennung Raumtrennung.

+0

Aber was ist, wenn ich eine größere Anzahl von Argumenten möchte, die in Variable x = $ {@: 2} sind. Zum Beispiel für größere Datei und diese Variable x ist 1 2 3 4 5 6? – davoid

+0

'awk -v c = $ x ...' wenn 'x =" 1 2 3 4 5 6 "'. –

+1

Vielen Dank, ich kämpfte mit awk in For-Schleife, aber Ihre Lösung ist besser :) – davoid

0
awk '{print $1 + $3}' file 
7 
2 
3