Fügen Sie eine Liste von Werten der Spalten A und B hinzu, die durch Leerzeichen getrennt sind, und zeigen Sie das Summationsergebnis [Duplikat] an.
Ich habe eine Datei namens fold.txt
. Es gibt zwei Werte in jeder Zeile, die durch ein Leerzeichen getrennt sind. Wenn ich sage, dass der erste Wert Spalte A und der zweite Wert nach Leerzeichen Spalte B darstellt, wie kann ich dann alle Werte von Spalte A und alle Werte von Spalte B addieren und die Summe jeder Spalte einzeln anzeigen?
Ich erwarte so etwas:
$ cat fold.txt
100 500
200 300
700 100
Ausgabe:
Total count Column A = 1000
Total count column B = 900
Antworten
Mit awk
:
awk '{ sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
print "Total count column B = " sum_B +0;
}' infile
Stellen Sie in der awk- Sprache, die ein Werkzeug für Textverarbeitungszwecke ist, $1
den Wert der ersten Spalte dar, $2
stellen Sie den Wert der zweiten Spalte dar, $3
für die dritte usw., und eine spezielle NF
stellt die letzte Spalten-ID und dementsprechend $NF
den Wert der letzten Spalte dar (sodass Sie sie ersetzen können $2
oben mit $NF
auch; und ja, Sie fangen es ab, wenn NF
es sich um die letzte Spalten-ID handelt. Der Wert der Variablen gibt also an, wie viele Spalten Sie haben (die Wertaktualisierung für jede Zeile awk wird aus der Eingabe gelesen).
Um den Randfall zu behandeln, in dem die Eingabedatei leer ist und dennoch eine numerische Ausgabe erhält, fügen wir dem Ergebnis 0 hinzu, um die awk
Ausgabe des numerischen Ergebnisses zu erzwingen .
Spalten (oder Felder) werden awk
durch die FS
Variable ( F eild S eparator) unterschieden, die standardmäßig Leerzeichen / Tabulatoren verwendet. Wenn Sie möchten, dass Spalten auf verschiedene Zeichen aufgeteilt werden, können Sie sie mit der -F
Option für awk
wie in neu definieren :
awk -F'<character-here>' '...' infile
oder innerhalb eines BEGIN{...}
Blocks wie mit FS
:
awk 'BEGIN{ FS="<character-here>"; }; { ... }' infile
Zum Beispiel für eine Eingabedatei wie unten (jetzt ist es Komma statt Leerzeichen):
100,500
200,300
700,100
Sie können Ihren awk
Code wie folgt schreiben :
awk -F',' '{ sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
print "Total count column B = " sum_B +0;
}' infile
Oder innerhalb eines BEGIN
Blocks:
awk 'BEGIN{ FS=","; }; { sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
print "Total count column B = " sum_B +0;
}' infile
Gehen Sie etwas komplexer vor und summieren Sie alle N Spalten Ihrer Eingabedatei im folgenden Beispiel:
100,500,140,400
200,300,640,200
700,100,400,130
Wir haben also NF
im ersten Absatz darüber gesprochen (der NF-Wert gibt an, wie viele Spalten Sie haben (Aktualisierung pro Zeile)):
awk -F',' '{ for (i=1; i<=NF; i++) sum[i]+=$i; };
END{ for (colId in sum) {
printf ("Total count Column: %d= %d\n", colId, sum[colId] );
};
}' infile
Das einzig Neue hier ist, dass wir ein awk
Array verwendet haben, um dieselbe Spalten-ID zu adressieren, die aus dem Wert von stammt, i
und ihre Werte $i
zu diesem Array hinzuzufügen (Index / Schlüssel dieses Arrays sind Spalten-IDs). Dann END{...}
durchlaufen wir am Block unser Array auf den Schlüsseln, die es gesehen hat, und drucken dann zuerst die Spalten-ID und dann die Summe der daneben. Sie sehen die Ausgabe wie folgt:
Total count Column: 1= 1000
Total count Column: 2= 900
Total count Column: 3= 1180
Total count Column: 4= 730
Es ist ein guter Job für DC.
dc liest zuerst die Daten aus fold.txt und nach dem Code aus sum_col_dc.
Verwenden Sie es so: dc fold.txt sum_col_dc
cat sum_col_dc
[lB+sBlA+sAz0<C]sC[lGLElDnnnp]sH[Total count Column ]sD[B]sE[A]SE[ = ]sGlCxlAlHxlBlHx
Mit ein bisschen mehr Details:
[lB+sBlA+sAz0<C]sC
[lGLElDnnnp]sH
[Total count Column ]sD
[B]sE
[A]SE
[ = ]sG
lCx
lA
lHx
lB
lHx
Genießen Sie DC
Weitere Erklärungen auf Anfrage.