staging.inyokaproject.org

Bash Script - Wenn, Dann Formel?

Status: Ungelöst | Ubuntu-Version: Server 22.10 (Kinetic Kudu)
Antworten |

rurotil

Anmeldungsdatum:
7. April 2009

Beiträge: 96

Hallo,

kann ich per akw oder gawk per Bash Script eine Formel innerhalb einer CSV Tabelle ausführen.

Wenn in Zelle B2 kein Preis enthalten ist, soll das Script den Preis aus Zelle E2 nehmen und mit 2 multiplizieren. Wenn ein Preis in Zelle B2 drinnen ist, den Preis erhalten. Das soll dann von Zeile 2 bis zum ende laufen.

Bekommt man sowas hin?

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4212

Kannst Du mal ein paar Beispielzeilen deiner CSV zeigen, also die ersten 10 oder so?

Vor allem sollten zwei Zeilen, einmal ohne und einmal mit Preis in Spalte b vorhanden sein.

rurotil

(Themenstarter)

Anmeldungsdatum:
7. April 2009

Beiträge: 96

Ja kann ich,

ProductId;ReferenceNo;EAN;Manufacturer;Price_B2B_Regular;Price_B2B_Discounted;Price_B2B_DiscountPercent;Price_B2B_DiscountAmount;Price_B2C_exclVAT;Price_B2C_inclVAT
3910113;AP9641;1,31304E+11;APC by Schneider Electric;19;19;0;0;0;0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1402176;P51U;8,87993E+11;Shuttle;2;2;0;0;0;0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5750126;LC125XLC;4,97777E+12;Brother;11,7;11,7;0;0;0;0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6481717;YEG-00496;343434365;Microsoft;11,1;11,1;0;0;31,75;46,31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4539967;FQC-08929;8,85371E+11;Microsoft;422,23;422,23;0;0;0;0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6170025;90MB0SY0-M0EAY0;1,7129E+12;Asustek;66,33;66,33;0;0;0;0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6452531;R18-05735;3,39994E+12;Microsoft;24;24;0;0;1,8;1,93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6480658;C28-00002;;Microsoft;54,22;54,22;0;0;61,63;96,13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5310142;UC2T0E;;Hewlett Packard;42;42;0;0;0;0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Das wäre meine Formel dazu

=WENN(I2=0;E2*1,2;I2)

in Datei test.csv in FELD X von Zeile 2 bis ende

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4212

Hm, und was ist jetzt FELD X? Ist dachte mit B2 meintest Du einfach die zweite Spalte, aber dem ist wohl nicht so.

rurotil

(Themenstarter)

Anmeldungsdatum:
7. April 2009

Beiträge: 96

bei Feld X soll einfach nur das Ergebnis stehen, aber wo das genau ist, ist mir eigentlich egal. Der Wert soll einfach nur pro Zeile in irgendeiner Spalte stehen.

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 7816

rurotil schrieb:

[…] Wenn in Zelle B2 kein Preis enthalten ist, soll das Script den Preis aus Zelle E2 nehmen und mit 2 multiplizieren. Wenn ein Preis in Zelle B2 drinnen ist, den Preis erhalten. Das soll dann von Zeile 2 bis zum ende laufen.

Eine typische Aufgabe für eine Tabellenkalkulation.

Bekommt man sowas hin?

Ja, mit einer Tabellenkalkulation. Die sind genau für so etwas erschaffen. Wähle stets ein der Aufgabenstellung angemessenes Werkzeug.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

rurotil schrieb:

Das wäre meine Formel dazu

=WENN(I2=0;E2*1,2;I2)

Also, I2 und E2 gibt es ja in einer CSV-Datei nicht. Ich vermute mal, Du meinst mit "I" Feld Nr. 9 und mit "E" Feld Nr. 5. Der Teil "E2*1,2" in der Formel kommt mir etwas seltsam vor. Wolltest Du nicht verdoppeln, also "E2*2"?

in Datei test.csv in FELD X von Zeile 2 bis ende

Meinst Du vielleicht so etwas?

1
awk -F \; -v OFS=\; 'NR==1; NR>1{if(!$9) $9=$5*2; print}' data

Wenn Du zeilenübergreifend rechnen willst, stimme ich kB zu: das sollte man dann lieber mit Libre Office Calc o.ä. machen.

rurotil

(Themenstarter)

Anmeldungsdatum:
7. April 2009

Beiträge: 96

Ich habe es nun doch lösen können mit "miller"

so sieht es nun das Ergebnis aus:

mlr --csv --fs ';' --ragged \
    remove-empty-columns then \
    put '
        $x = $Price_VAT;
        $x == 0 {
            $x = 1.2*float(ssub(string($Price_Regular),",","."));
            $x = ssub(string($x),".",",");
        }' products.csv

rurotil

(Themenstarter)

Anmeldungsdatum:
7. April 2009

Beiträge: 96

Ich hatte leider etwas vergessen.

Wenn in der Tabelle der Wert nicht Null ist, sondern einfach nur leer. Funktionert das leidern icht. Kann man das auch noch lösen?

Das waren meine Ansätze:

mlr --csv --fs ';' --ragged \
    remove-empty-columns then \
    put '
        $x = $Price_VAT;
        $x == 0 {
            $x = 1.2*float(ssub(string($Price_Regular),",","."));
            $x = ssub(string($x),".",",");
        }' products.csv

oder

POSIXLY_CORRECT=1 awk -F ';' -v OFS=';' '
  {print $0, NR == 1 ? "Price" : $1 ? $1 : $3 * 1.2}' < products.csv

noisefloor Team-Icon

Ehemaliger
Avatar von noisefloor

Anmeldungsdatum:
6. Juni 2006

Beiträge: 28316

Hallo,

Wähle stets ein der Aufgabenstellung angemessenes Werkzeug.

Wenn es keine Tabellenkalkulation mit GUI (wie LibreOffice oder Excel) sein soll / darf, kann man das auch mit entsprechenden Skripten und Bibliotheken in der Programmiersprache seiner Wahl machen. Für Python wäre das hier z.B. Pandas 🇬🇧. Entsprechende Bibliotheken / Module gibt es aber auch sicherlich für die meisten anderen gängigen Programmiersprache. Wenn du das rein als Bash Skript machen willst kommst du sicherlich irgendwann an die Grenzen, weil das nicht wirklich für 2-dimensionale, tabulare Daten ausgelegt ist.

Gruß, noisefloor

rurotil

(Themenstarter)

Anmeldungsdatum:
7. April 2009

Beiträge: 96

Ja verstehe ich grundsätzlich schon.

Aber mit diesen 2 Formeln funktioinert es doch bisher schon. Jetzt bräuchte ich da nur noch die Funktion wenn 0 oder "" Das bekommt man doch sicherlich noch irgendwie hin?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

rurotil schrieb:

Aber mit diesen 2 Formeln funktioinert es doch bisher schon. Jetzt bräuchte ich da nur noch die Funktion wenn 0 oder "" Das bekommt man doch sicherlich noch irgendwie hin?

Klar, denn die bash ist - wie die anderen Sprachen - Turing-vollständig. Ist halt nur die Frage, welches Maß an Schmerzen Du Dir antun willst.

Antworten |