otto-zetel
Anmeldungsdatum: 4. Juni 2016
Beiträge: 7
|
Hallo zusammen Leider stehe ich ein wenig auf dem Schlauch. Ich möchte folgendes erreichen.
Ich habe eine CSV Datei mit drei Spalten. Getrennt mit ";"
Wert1;Wert2;Wert3
Aus Wert 1 soll der Dateiname werden. Aus Wert 2 und 3 der Inhalt der Zeile der dann in Dateiname Wert1 eingefügt wird.
Einzelne Codezeile habe ich. Leider funktionieren sie nicht zusammen.
#!/bin/bash
while read line; do /usr/bin/touch ./client/$line | awk '{print $1}'; done < test.txt
for i in $(ls ./client); do echo $(cut -d: -f2,3 test.txt) > ./client/$line ; done Wahrscheinlich ganz wieder einmal ganz einfach 🤓 Danke für die Unterstützung. Gruss
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Da ich keine Lust auf Bash habe, hier eine Möglichkeit in Python3
| #!/usr/bin/env python3
import fileinput
for line in fileinput.input():
filename, data = line.split(';', maxsplit=1)
with open(filename, 'w') as target:
target.write(data)
|
Aufruf dann z.B. so (ausführbar machen nicht vergessen):
./convert_files.py test.txt
Falls da noch Quoting und andere CSV-Späße vorkommen, gibt es auch ein hübsches Modul dafür: https://docs.python.org/3/library/csv.html
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Hallo! Ich würde das so machen
| #!/bin/bash
FILE="my input file.csv"
TARGET_FOLDER="/tmp"
for line in $(cat "$FILE") #oder while read line
do
FN="$TARGET_FOLDER/"$(echo $line |cut -d\; -f1)
touch "$FN"
echo $(echo $line |cut -d\; -f2) >> "$FN"
echo $(echo $line |cut -d\; -f3) >> "$FN"
done;
|
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Hi otto-zetel, herzlich willkommen bei uns hier auf dem Forum ! Das ganze ist nicht etwa eine Hausaufgabe, dass es unbedingt mit Shellbefehlen gemacht werden muss ? 😉 Wenn ich nämlich höre "in Spalten zerlegen", dann klickt es bei mir sofort: Ein Fall für awk ! Das ist nämlich extra dafür gemacht, und man hat wenig Aufwand: track@track:~$ echo "suppe1;gemüse;kartoffeln
> suppe2;fleisch;nudeln" | awk -F';' '{OFS=FS; print $2,$3 > $1 }'
track@track:~$ head suppe*
==> suppe1 <==
gemüse;kartoffeln
==> suppe2 <==
fleisch;nudeln Wenn es denn unbedingt mit der Shell sein soll, dann würde ich das Trennen in Spalten gleich beim read mit erledigen. Dann wird es viel einfacher: track@track:~$ echo "suppe1;gemüse;kartoffeln
suppe2;fleisch;nudeln" | ( IFS=";" read -a feld; echo "${feld[0]} -> ${feld[1]} ${feld[2]}" )
suppe1 -> gemüse kartoffeln Vor allem ist es aber ein No-Go, die Ausgabe von ls im for - Befehl auszuwerten ! LG, track
|
noisefloor
Ehemaliger
Anmeldungsdatum: 6. Juni 2006
Beiträge: 28954
Wohnort: WW
|
Hallo, @seahawk1986 in deinem Beispiel fehlt doch bei fileinput.input() das Argument, welche Datei(en) einzulesen sind, oder? Gruß, noisefloor
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
noisefloor schrieb: Hallo, @seahawk1986 in deinem Beispiel fehlt doch bei fileinput.input() das Argument, welche Datei(en) einzulesen sind, oder?
Nein, das ist das schöne daran - fileinput kann die übergebenen Argumente nutzen oder von stdin lesen, falls keine Argumente übergeben wurden: https://docs.python.org/3.5/library/fileinput.html | import fileinput
for line in fileinput.input():
process(line)
|
This iterates over the lines of all files listed in sys.argv[1:], defaulting to sys.stdin if the list is empty.
|
otto-zetel
(Themenstarter)
Anmeldungsdatum: 4. Juni 2016
Beiträge: 7
|
Cool ich wusste das es ganz einfach ist.Bei gefühlten 30° schaue ich es mir heute abend an.
Danke für die Ideen.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
Oder so:
| while read line; do datei=${line/;*/}; wert=${line/$datei;/}; echo $wert > "$datei"; done < test.txt
|
bzw.:
| while read line
do
datei=${line/;*/}
wert=${line/$datei;/}
echo $wert > "$datei"
done < test.txt
|
|
Reflecting-God
Anmeldungsdatum: 20. September 2019
Beiträge: 6
|
Hallo , Ich habe folgendes Problem : Ich habe eine script an die ich Parameter aus einer csv Datei anhängen will und dann ausführen lassen will. Ich habe das ganze schon probiert aber komme nicht zu einer Lösung. Auch mit cat bin ich nicht weitergekommen da ich es nicht geschafft habe hinter den Befehl die Parameter zu packen. Werden Ausgaben in einem Bash Script eigentlich direkt auch ausgeführt oder muss ich dahinter noch ein Enter setzen? Jede Zeile in der csv soll ein gesonderter Befehl sein. Trennzeichen habe ich tab genommen z.b. Habt ihr eine Idee?
|
Reflecting-God
Anmeldungsdatum: 20. September 2019
Beiträge: 6
|
importscript --user=tau --ext=4711 --pin=123456 --firstname=tat --lastname=tum --language=German --email=test@gkg.de --host=1|195.108.10.206 Das wäre der Befehl hinter dem = soll jeweils ein Feld aus der CSV Zeile kommen dann der Befeh ausgeführt werden und danch die nächste Zeile zusammengebaut werden geht bestimmt über nen Feld aber weiss nicht wie ich das zusammen stricke.
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Ausgaben eines Shell-Skripts werden nicht automatisch von der Shell ausgeführt. Wenn deine Datei die Argumente so pro Zeile hat:
| tau 4711 123456 tat tum German test@gkg.de 1|195.108.10.206
|
könnte man sowas machen (in allen Fällen erwartet das Skript die Daten entweder auf stdin oder aus einer als Argument übergebenen Datei(en)): | #!/usr/bin/env python3
import fileinput
import subprocess
for line in fileinput.input():
cmd = ['importscript']
args = line.rstrip().split('\t')
arg_list = "--user={}\t--ext={}\t--pin={}\t--firstname={}\t--lastname={}\t--language={}\t--email={}\t--host={}\t".format(*args).split('\t')
cmd.extend(arg_list)
subprocess.run(cmd)
|
Mit den Mitteln der Bash geht das natürlich auch:
1
2
3
4
5
6
7
8
9
10
11
12
13 | #!/bin/bash
cmd="importscript"
arg_parts=('--user=' '--ext=' '--pin=' '--firstname=' '--lastname=' '--language=' '--email=' '--host=')
while read -r line
do
IFS=$'\t' arg_values=($line)
for i in "${!arg_values[@]}"
do
args+=("${arg_parts[$i]}${arg_values[$i]}")
done
"$cmd" "${args[@]}"
done < <(cat "${@:-/dev/stdin}")
|
|
Reflecting-God
Anmeldungsdatum: 20. September 2019
Beiträge: 6
|
Hi Danke erstmal an welcher Stelle List der die csv Datei ein?
|
Reflecting-God
Anmeldungsdatum: 20. September 2019
Beiträge: 6
|
Weil das Importscript kommt ja vor die Argumenten Liste das passt das ist der Befehl für den eigentlichen Import Die Argument wert wie der Name „tau“. Werden aus der csv gelesen. Z.b. Import.csv An welcher Stelle binde ich die ein? Um dann die Ausgabe importscript —user=wert. .... Zu erhalten und auf der Shell auszuführen für jeden Zeilen Durchlauf der csv? Danke für deine Mühe!
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Reflecting-God schrieb: Hi Danke erstmal an welcher Stelle List der die csv Datei ein?
Die Datei kannst du den Skripten als Argument übergeben oder über stdin reinpipen. Im Python-Skript liest er in Zeile 5 die Daten zeilenweise ein, im Shell-Skript mit dem Konstrukt in Zeile 5 und 13.
|
Reflecting-God
Anmeldungsdatum: 20. September 2019
Beiträge: 6
|
Okay also lege ich dann ein Script mit dem Code an Z.b. Test Und würde dann Test -Import.csv. Eingeben? Wenn diese im gleichen Verzeichnis liegen.
|