Ich habe eine große Datei im folgenden Format:
2 1019 0 12
2 1019 3 0
2 1021 0 2
2 1021 2 0
2 1022 4 5
2 1030 0 1
2 1030 5 0
2 1031 4 4
Wenn die Werte in Spalte 2 übereinstimmen, möchte ich die Werte in Spalte 3 und 4 beider Zeilen summieren, ansonsten nur die Summe der Werte in der eindeutigen Zeile.
Die Ausgabe, auf die ich hoffe, würde also so aussehen:
2 1019 15
2 1021 4
2 1022 9
2 1030 6
2 1031 8
Ich kann Dateien nach Spalte 2 mit awk
oder sortieren sort
und die letzten Spalten mit summieren awk
, aber nur für einzelne Zeilen, nicht für zwei Zeilen, in denen Spalte 2 übereinstimmt.
text-processing
awk
sort
uniq
TomPio
quelle
quelle
$1 $2
als Schlüssel.Antworten:
Ich würde das in Perl machen:
Oder awk:
Wenn Sie die Ausgabe nach der zweiten Spalte sortieren möchten, können Sie einfach weiterleiten an
sort
:Beachten Sie, dass beide Lösungen auch die 1. Spalte enthalten. Die Idee ist, die erste und die zweite Spalte als Schlüssel für einen Hash (in Perl) oder ein assoziatives Array (in awk) zu verwenden. Der Schlüssel in jeder Lösung lautet:
column1 column2
Wenn zwei Zeilen dieselbe Spalte zwei, aber eine andere Spalte eins haben, werden sie separat gruppiert:quelle
Vielleicht könnte dies helfen, aber ist Spalte 1 immer 2 und hängen die Ergebnisse davon ab?
oder wie von glenn jackman in kommentaren zum sortieren erwähnt:
quelle
PROCINFO["sorted_in"] = "@ind_num_asc"
anstelle von Rohrleitungen zusort
. ref gnu.org/software/gawk/manual/html_node/…Sie können die Daten vorsortieren und awk die Details überlassen:
Möglicherweise möchten Sie den Akku zurücksetzen:
Ausgabe:
Wenn Sie wirklich die erste Spalte behalten möchten, gehen Sie wie folgt vor:
Ausgabe:
Erläuterung
Die
p
Variable enthält den$2
Wert der vorherigen Zeile oder$1FS$2
im zweiten Fall oben. Dies bedeutet, dass das{print p,s}
ausgelöst wird, wenn$2
die vorherige Zeile nicht mit der aktuellen Zeile übereinstimmt (p!=$2
).quelle
sort -k2
nach der zweiten Spalte sortieren könnenMit dem Schweizer Taschenmesser util
mlr
:Ausgabe:
Anmerkungen:
--nidx
weistmlr
an, numerische Feldnamen zu verwenden.put '$5=$3+$4'
macht ein neues 5. Feld, die Summe der Felder 3 und 4 .Die
stats1
Funktion (oder „ Verb “) ist ein kleines Schweizeres Messerinnerhalb des größeren Schweizeren Taschenmesser der
mlr
mit mehrere Akkumulator basierter Funktionen wiesum
,count
,mean
, usw.stats1 -g 1,2
gruppiert die Daten nach Spalten 1 und 2 und-f 5 -a sum
addiert dann das Feld 5 dieser Gruppen .stats1
druckt nur benannte Felder.quelle