gnude
Anmeldungsdatum: 11. Juli 2014
Beiträge: 806
|
Hallo,
ich habe folgende Frage.... in einer Tabellenkalkulation sind verschiedene Spalten und Zeilen,
wenn der Wert in der ersten Spalte gleich ist sollen die Zeilen addiert werden.
Beispiel: Kundennr. Name Preis
1 Hans 5
2 Frank 10
1 Hans 7
2 Frank 12
3 Petra 8
1 Hans 2 Jetzt möchte ich das bei gleicher Kudennummer der Preis addiert wird.
Das Ergebnis sollte dann sein: 1 Hans 14
2 Frank 22
3 Petra 8 Gibt es in Libreoffice ne entsprechende Funktion?
(ne einfache Lösung per Python oder Bash wäre ich auch nicht abgeneigt ...)
|
Prof._Frink
Anmeldungsdatum: 29. Mai 2010
Beiträge: 1096
|
Hey, das geht ganz gut mit awk | #!/usr/bin/awk -f
NR > 1 {
array[$1" "$2] += $3
}
END{
for (x in array){
print x ,array[x]
}
}
|
$ awk -f skript.awk kunden.txt | sort -n
1 Hans 14
2 Frank 22
3 Petra 8 Viele Grüße, Frink
|
gnude
(Themenstarter)
Anmeldungsdatum: 11. Juli 2014
Beiträge: 806
|
Das klingt interessant, als Trenner zwischen den Zeichen steht ein ";"
kann das berücksichtigt werden. Und kann ich auch nur bestimmte Spalten ausgeben lassen? Also in meinem Fall nur Kundenummer und Preis.
Zur Sortierung welche Zeilen genommenw erden soll nur die
erste Spalte (Kundennummer dienen)
|
Prof._Frink
Anmeldungsdatum: 29. Mai 2010
Beiträge: 1096
|
gnude schrieb: Das klingt interessant, als Trenner zwischen den Zeichen steht ein ";"
kann das berücksichtigt werden.
Ja, mit $ awk -v "FS=;" -f skript.awk kunden.txt
Und kann ich auch nur bestimmte Spalten ausgeben lassen?
Also in meinem Fall nur Kundenummer und Preis.
Zur Sortierung welche Zeilen genommenw erden soll nur die
erste Spalte (Kundennummer dienen)
Ja, das machst du am besten hinterher mit cut :
$ awk -v "FS=;" -f skript.awk kunden.txt | sort -n | cut -d " " -f 1,3
1 14
2 22
3 8 Frink
|
hakel
Anmeldungsdatum: 13. August 2009
Beiträge: 23336
|
Das sollte eigentlich auch mit Libre Base gehen, Quelle deine Calc. Group By, Aggregatfunktion - ganz einfach über Abfrage. Irgendwann ist ein Spreadsheet am Ende was Daten angeht. 😀
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Mit Python 3 ginge das z.B. so:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 | #!/usr/bin/env python3
import fileinput
import sys
from collections import defaultdict
customer_sums = defaultdict(float)
line_gen = fileinput.input()
try:
next(line_gen)
except StopIteration:
sys.exit("missing input")
for line in line_gen:
customer_id, name, price = line.split()
try:
customer_id = int(customer_id)
price = float(price)
except ValueError as e:
print("invalid data: '{}'".format(line.rstrip()), file=sys.stderr)
sys.exit(e)
customer_sums[(customer_id, name)] += price
for customer, price in sorted(customer_sums.items()):
print("{}\t{}\t{}".format(*customer, price))
|
Die Datei mit den Daten übergibt man dem Skript dann entweder als Argument oder auf stdin:
$ ./customer_sum.py << EOF
> Kundennr. Name Preis
> 1 Hans 5
> 2 Frank 10
> 1 Hans 7
> 2 Frank 12
> 3 Petra 8
> 1 Hans 2
> EOF
1 Hans 14.0
2 Frank 22.0
3 Petra 8.0
|
gnude
(Themenstarter)
Anmeldungsdatum: 11. Juli 2014
Beiträge: 806
|
Klappt noch nicht... Zahlen sind Dezimalzahlen mit Vorzeichen. Ich glaub darüber stolpert er....
|
Prof._Frink
Anmeldungsdatum: 29. Mai 2010
Beiträge: 1096
|
gnude schrieb: Klappt noch nicht... Zahlen sind Dezimalzahlen mit Vorzeichen. Ich glaub darüber stolpert er....
Für welchen Input genau klappt es nicht?
|
gnude
(Themenstarter)
Anmeldungsdatum: 11. Juli 2014
Beiträge: 806
|
Bei der Spalte mit den Preisen .... stand immer nur "0"
die Daten liegen for im Format: 360.20 oder auch (bei Gutschriften) -110.20
|
gnude
(Themenstarter)
Anmeldungsdatum: 11. Juli 2014
Beiträge: 806
|
Die erste Spalte kommt auch doppelt raus. Bei mir sieht der so aus #!/usr/bin/awk -f
NR > 1 {
array[$1] += $13
}
END{
for (x in array){
print x ,array[x]
}
} ISt die Änderung im Array richtig, da ich ja nur die erste Spalt nutzen wollte zur Addition....?
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
gnude schrieb: Klappt noch nicht... Zahlen sind Dezimalzahlen mit Vorzeichen. Ich glaub darüber stolpert er....
Python erwartet (wie viele Shell-Tools auch) standardmäßig einen Punkt, kein Komma als Dezimaltrennzeichen.
Man kann die Locale-Einstellungen bei Ein- und Ausgabe aber durchaus berücksichtigen:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 | #!/usr/bin/env python3
import fileinput
import locale
import sys
from collections import defaultdict
locale.setlocale(locale.LC_ALL, '')
customer_sums = defaultdict(float)
line_gen = fileinput.input()
try:
next(line_gen)
except StopIteration:
sys.exit("missing input")
for line in line_gen:
customer_id, name, price = line.split()
try:
customer_id = int(customer_id)
price = locale.atof(price)
except ValueError as e:
print("invalid data: '{}'".format(line.rstrip()), file=sys.stderr)
sys.exit(e)
customer_sums[(customer_id, name)] += price
for customer, price in sorted(customer_sums.items()):
print("{}\t{}\t{}".format(*customer, locale.format_string("%6.2f", price)))
|
|
Prof._Frink
Anmeldungsdatum: 29. Mai 2010
Beiträge: 1096
|
gnude schrieb: Die erste Spalte kommt auch doppelt raus. Bei mir sieht der so aus #!/usr/bin/awk -f
NR > 1 {
array[$1] += $3
}
END{
for (x in array){
print x ,array[x]
}
} ISt die Änderung im Array richtig, da ich ja nur die erste Spalt nutzen wollte zur Addition....?
$13 muss durch $3 ersetzt werden. Dezimalzahlen sollten eigentlich kein Problem sein.
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
gnude schrieb: ISt die Änderung im Array richtig, da ich ja nur die erste Spalt nutzen wollte zur Addition....?
Ist die Kombination aus ID und Name eindeutig oder nicht?
|
gnude
(Themenstarter)
Anmeldungsdatum: 11. Juli 2014
Beiträge: 806
|
@Prof._Frink
Ich hab die 3 durch 13 ersetzt weil in meiner Datei das Feld was addiert werden soll
an 13. Stelle steht. Nur zur Vereinfachung habe ich dass im Beispiel so gehalten.
In Wirklichkeit ist ne komplette Adresse und so gedöns mit da drin. @seahawk1986
Nein den Name wollte ich gar nich heranziehen. Im Grunde ist nur die erste ID (Kundennummer)
und wenn die gleich ist sollen die Summen addiert werden.
|
umbhaki
Supporter
Anmeldungsdatum: 30. Mai 2010
Beiträge: 2521
Wohnort: Düren/Rhld
|
Das geht doch auch mit Calc in einer Pivot-Tabelle. Man markiere die zu bearbeitenden Daten und rufe die Funktion auf (Menü „Daten“ → Pivot-Tabelle). Dort entscheide man sich für „Aktuelle Auswahl“ (Anhang Piv1). Im folgenden Dialog ziehe man aus der rechten Liste die entsprechenden Einträge nach „Zeilenfelder“ und „Datenfelder“ und definiere darunter den Ort, wo die Tabelle erscheinen soll (Anhang Piv2). Das Ergebnis sieht dann so aus wie im Anhang Piv3.
- Bilder
|