ubuntuusers.de

werte aus Datei lesen?

Status: Gelöst | Ubuntu-Version: Lubuntu 20.04 (Focal Fossa)
Antworten |

Mario9781

Anmeldungsdatum:
19. Januar 2022

Beiträge: 6

Hallo habe mal eine Frage wie kann ich einen Wert aus einer datei lesen und in eine andere datei speichern Bräuchte den Wert dritte Stelle(45910) mit kommastelle also 459,10

111300022222|Steckdose|45910|230676|31986|280|0|2820|706

Danke Lg

DJKUhpisse Team-Icon

Supporter, Wikiteam
Avatar von DJKUhpisse

Anmeldungsdatum:
18. Oktober 2016

Beiträge: 18225

Wohnort: in deinem Browser, hier auf dem Bildschirm

Das Tool cut kann dir hier helfen. Damit bekommst du dann den 3. Wert.

m@ryz:~$ echo '111300022222|Steckdose|45910|230676|31986|280|0|2820|706' |cut -d "|" -f3
45910
m@ryz:~$ 

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13213

Und wenn das immer mindestens dreistellige Cent-Beträge sind, kann man das Komma so einfügen:

1
2
$ echo '111300022222|Steckdose|45910|230676|31986|280|0|2820|706' | cut -d '|' -f3 | sed -r 's#^(.+)(..)$#\1,\2#'
459,10

Mario9781

(Themenstarter)

Anmeldungsdatum:
19. Januar 2022

Beiträge: 6

Würde das funktionieren??

TEMP=$(echo "scale=1;$(cut -d "|" -f3 /var/temp/aha_60-087610249191.csv ) / 1000 "|bc -l)

shiro Team-Icon

Supporter

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1274

Mario9781 schrieb:

Würde das funktionieren??

Na ja, fast. Statt durch 1000 sollte man besser durch 100 teilen und 2 Nachkommastellen wählen. bc arbeitet mit Dezimalpunkt, den man dann in ein Dezimalkomma wandeln müsste:

TEMP=$(echo "scale=2;$(cut -d "|" -f3 /var/temp/aha_60-087610249191.csv ) / 100"| /usr/bin/bc -l | tr '.' ',')
echo $TEMP
459,10

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11265

Wohnort: München

Oder man macht das unter Berücksichtigung der locale-Einstellungen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/usr/bin/env python3
import fileinput
import locale

locale.setlocale(locale.LC_ALL, '')  # use the locale settings given by the environment
# or force a locale
# locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')

for line in fileinput.input():
    if not (line := line.strip()):
        continue
    fields = line.split('|')
    print(locale.format_string('%.2f',int(fields[2])/100))

Der Aufruf wäre dann z.B. so, wenn man das Skript ausführbar gemacht hat:

echo '111300022222|Steckdose|45910|230676|31986|280|0|2820|706' | ./parse_amount.py
# bzw.
./parse_amount.py  /var/temp/aha_60-087610249191.csv 

und die Ausgabe kann man in eine Datei umleiten (vgl. Shell/Umleitungen):

./parse_amount.py  /var/temp/aha_60-087610249191.csv > output.csv 

shiro Team-Icon

Supporter

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1274

bc arbeitet mit Dezimalpunkt, den man dann in ein Dezimalkomma wandeln müsste:

bc arbeitet wirklich nicht Posix complient und ignoriert LC_NUMERIC. ABER bei awk kann man Posix erzwingen:

$ echo '111300022222|Steckdose|45910|230676|31986|280|0|2820|706' | awk -F"|" '{printf "%''.2f\n",$3/100}'
459.10
$ # ABER mit POSIX (-P oder --posix)
$ echo '111300022222|Steckdose|45910|230676|31986|280|0|2820|706' | awk -P -F"|" '{printf "%5.2f\n",$3/100}'
459,10
$
$ locale -k LC_NUMERIC
decimal_point=","
thousands_sep="."
grouping=3;3
numeric-decimal-point-wc=44
numeric-thousands-sep-wc=46
numeric-codeset="UTF-8"
$
Antworten |