In einer Datei mit unterschiedlicher Anzahl von Spalten, die durch Leerzeichen '' begrenzt sind, wird die Summe der Spalten gezählt. Ein Beispiel würde die Notwendigkeit zeigen:
File A:
1 2
2 3
4 5 6
1 1 1 5
Dann wäre die Ausgabe:
- für Spalte 1 (1 + 2 + 4 + 1) = 8
- für Spalte 2 ist 11
- für Spalte 3 ist 7
- für Spalte 4 ist 5
command-line
scripts
Maythux
quelle
quelle
Verwenden Sie
numsum
für diese Aufgabe und trennen Sie zwischen Datenverarbeitung und Ausgabe der Ergebnisse.Installieren
num-utils
, wir brauchennumsum
Und fangen Sie mit an
Beispiel
oder mit Ihrem gewünschten Format:
von
man numsum
Beispiele aus
man numsum
quelle
quelle
(( col1 += a ))
, etc. Auchecho "..."
ist sicherer, sowiewhile IFS= read -r ...
echo
auf diese Weise sicher verwendet werden, um Zahlen,$IFS
Standardeinstellungen bei Leerzeichen und Zahlen, die voraussichtlich Zahlen sind, wiederzugeben , sodass keine Notwendigkeit besteht, sich mit Backslashes zu befassen. Der einzige Nachteil dieser Antwort ist die Notwendigkeit, die Anzahl der Spalten vor der Ausführung zu kennen.echo "[...]"
das korrekte Drucken dessen, was Sie nicht ausgeben möchten, macht keinen Sinn.echo $var
undwhile read a b c
es funktioniert hier. Sie werden sich jedoch daran gewöhnen, es schwach zu schreiben, und eines Tages werden Sie seltsame Fehler bei der Verarbeitung einer komplexeren Datei erhalten. Dann werden Sie feststellen, dass das Zitieren von Variablen und das Verwendenwhile IFS= read -r ...
sicherer war und Sie sagen: "Oh ja, Fedorqui hatte Recht, ich hoffe, ich könnte ihn haben, um ihn zu umarmen, um Dankbarkeit zu zeigen!".Nach den Kommentaren zu Ihrer eigenen Antwort zu urteilen, möchten Sie jeweils nur die Summe einer Spalte. Wenn ja, ist hier ein nicht-awk-Weg, um es zu tun:
wo Sie das durch die
3
Spaltennummer ersetzen würden, die Sie interessiert.quelle
Hier ist ein einzeiliger Perl-Skriptansatz. Dies beruht auf der Verwendung eines
-a
Flags, das die automatische Aufteilung der aktuell gelesenen Zeile mit dem-n
Flag in ein Array ermöglicht@F
. Alles, was wir tun müssen, ist, diese Elemente zu durchlaufen und sie ihrem jeweiligen Index im$sum
Array hinzuzufügen. Somit ist effektiv jedes Array-Element eine Summe für die jeweilige Spalte. Schließlich drucken wir das Ergebnis innerhalb desEND
Codeblocks.Alternativ finden Sie hier einen vollständigen Perl-Skriptansatz. Es basiert darauf, jede Zeile in ein Array aufzuteilen und über jedes Element in diesem Array zu iterieren, wobei jede Zahl zu ihrem jeweiligen Besitz im
@sums
Array hinzugefügt wird. Das Skript druckt jede Zeile aus und erstellt dann einen Bericht für jede Spalte. Drucken jeder Zeile kann entfernt werden , indem#
vorprintf("%s",$line);
Die Verwendung ist einfach
chmod +x ./sum_columns.pl && ./sum_columns.pl input.txt
. Zum Beispiel:quelle
Eine einfache Lösung:
Ersetzen Sie i durch die Spaltennummer, zum Beispiel Spalte1:
Ausgabe ist:
quelle