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.

Dec 29 2020

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

5 αғsнιη Dec 29 2020 at 00:00

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, $1den Wert der ersten Spalte dar, $2stellen Sie den Wert der zweiten Spalte dar, $3für die dritte usw., und eine spezielle NFstellt die letzte Spalten-ID und dementsprechend $NFden Wert der letzten Spalte dar (sodass Sie sie ersetzen können $2oben mit $NFauch; und ja, Sie fangen es ab, wenn NFes 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 awkAusgabe des numerischen Ergebnisses zu erzwingen .

Spalten (oder Felder) werden awkdurch die FSVariable ( 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 -FOption für awkwie 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 awkCode 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 BEGINBlocks:

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 NFim 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 awkArray verwendet haben, um dieselbe Spalten-ID zu adressieren, die aus dem Wert von stammt, iund ihre Werte $izu 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
ctac_ Dec 30 2020 at 01:56

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.