2016-12-15 7 views
0

Ich muss ein Skript erstellen, das in der Lage sein wird, die Spalten zu summieren. Die Datei sieht wie folgt aus:Mehrere Argumente in Shell-Skript mit awk

1 2 3 
1 2 
1 

Während ./sum.sh Skript ohne das Argument der Ausführung ich die Summe aller Spalten erhalten so die Antwort ist 10. Aber ich muss es nur bestimmte Spalten machen hinzuzufügen. Zum Beispiel ./sum.sh 1 3 sollte erste und dritte Spalte summiert und 6.

Meinen Code geben:

sum=0 

if [[ $# -eq 0 ]]; then 
    awk '{for(i=1;i<=NF;i++) sum+=$i;}; END {print sum}' plik.txt 
    else 
    exit 0; 
fi 

while [ $# -gt 0 ] 
do 
    awk '{sum +="$1"} END {print sum}' plik.txt 
    shift 
done 

Ich denke, dass ich zu der Lösung ganz in der Nähe bin, aber da muss etwas fehlen.

+0

a Es gibt Gute Lösung hier, ohne 'awk' zu verwenden: http://stackoverflow.com/questions/33006845/how-to-sum-a-row-of-numbers-from-text-file-bash-shell Wenn Sie dies vorhaben, ist es besser, awk zu entscheiden, ob pro Zeile ein Argument oder mehr vorhanden ist. – Yaron

+0

Aber ich muss es mit awk tun. Ich weiß, dass dies zwar nicht so schlecht ist, aber es gibt nur einen kleinen Teil, den ich vermisse, um das zu erreichen, was ich will. – codddeer123

+0

Die von mir bereitgestellte Lösung wird nicht pro Zeile gedruckt. Wenn Sie die Summe pro Zeile berechnen möchten, muss ich einige kleine Änderungen vornehmen. – Yaron

Antwort

1

hier ist eine Kombination aus Ihrem Skript und Lösung von Kent

#!/bin/bash 

file=plik.txt 

if [ $# -eq 0 ]; 
    then 
     awk  '{for(i=1;i<=NF;i++) sum+=$i} 
      END {print sum}' "$file" 
    else 
     awk -v cols="$*" 'BEGIN {split(cols,cs)} 
           {for(c in cs) sum+=$cs[c]} 
          END {print sum}' "$file"  
fi 

in Aktion

$ ./sum.sh 1 
3 

$ ./sum.sh 
10 

$ ./sum.sh 1 3 
6 

$ ./sum.sh 1 2 
7 

$ ./sum.sh 1 2 3 4 
10 

$ ./sum.sh 1 2 3 
10 
0

Das ist, was ich kam mit, keine bash Bedingungen erforderlich:

awk 'BEGIN{sum=0} {if(NF==1) sum+=$1;else for(i=1;i<=NF;i++) sum+=$i;} END{print sum}' plik.txt

+0

'./sum.sh 3' gibt 10 zurück und' ./sum.sh 2' gibt auch 10 zurück, so dass es nicht funktioniert. Ich muss nur bestimmte Spalten zusammenfassen, wie ich bereits erwähnt habe. './sum.sh 1 3 'sollte die erste und dritte Spalte der Datei' plik.txt' addieren. – codddeer123

+0

Was mache ich, wenn eine Spalte nicht existiert? – Yaron

+0

hmm, Script kann mit Info über nicht korrektes Argument beendet werden, aber für den Moment möchte ich nur die ausgewählten Spalten summieren. – codddeer123

2

Dieses Motto sollte funktionieren:

awk -v c="1 3" 'BEGIN{split(c,cols)} 
       {for(x in cols)s+=$cols[x]}END{print "Sum:"s}' file 

Notiere die c="1 3" bedeutet, dass die Spalten Summe tun wollen , Raum getrennt. Es könnte durch Shell-Skript-Variable festgelegt werden: -v c="$var", das awk wird die Berechnung und Ausgabe durchführen.

Mit Ihrer Beispieldatei, die oben Einzeiler Ausgänge:

Sum:6 
+0

es funktioniert, aber ich hatte gehofft für kleinere Aktualisierung von dem, was ich mit Verschiebung gebucht. – codddeer123

+0

@ Codddeer123 Sie brauchen nicht verschieben, nur alle Parameter zu sammeln, und bauen Sie die 'abcd' Zeichenfolge, und übergeben Sie die Awk-Zeile – Kent

+0

Ich kam mit etwas wie folgt:' während [[$ # -gt 0]] do awk -VX = "$ 1" '{sum + = $ x} ENDE {print sum}' plik.txt Verschiebung done' und ./sum.sh 1 2 nach der Ausführung gibt es 3 und 4, so fügt sie erste und zweite Spalte. Wie fügt man sie zusammen und erhält die endgültige Antwort? – codddeer123

Verwandte Themen