Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
-
Windmann
- Beiträge: 62
- Registriert: 13.09.2004 19:12:24
Beitrag
von Windmann » 28.10.2005 12:47:09
Hallo,
ich habe mit Skripting bisher noch nicht allzuviel gemacht. Ich suche ein Skript, dass es mir erlaubt aus dem unten stehenden Text, Spalten auszulesen - z.B. Spalte 3 und 4.
Kann das hier Jemand?
Vielen Dank vorab für die Antworten.
Gruß Windmann
Code: Alles auswählen
FB;Ordner;Q-Dom;G-Read;G-Write;G-Read;G-Write
12;12.0;haus;g120r;g120rw;g120r;g120rw
12;12.1;haus;g121r;g121rw;g121r;g121rw
12;12.2;haus;g122r;g122rw;g122r;g122rw
12;12.3;haus;g123r;g123rw;g123r;g123rw
11;11.0;haus;g110r;g110rw;g110r;g110rw
11;11.1;haus;g111r;g111rw;g111r;g111rw
60;60.1;dom;g601r;g601rw;g601r;g601rw
60;60.2;dom;g602r;g602rw;g602r;g602rw
60;60.3;dom;g603r;g603rw;g603r;g603rw
Debian Linux - Woody
-
eC
- Beiträge: 354
- Registriert: 24.07.2002 13:34:13
- Wohnort: karlsruhe
Beitrag
von eC » 28.10.2005 12:59:03
Windmann hat geschrieben:Hallo,
ich habe mit Skripting bisher noch nicht allzuviel gemacht. Ich suche ein Skript, dass es mir erlaubt aus dem unten stehenden Text, Spalten auszulesen - z.B. Spalte 3 und 4.
Hi,
das kannst Du über
cut machen.
Für infos siehe
Dein BSP sollte so gehen
gruss
eC
-
Windmann
- Beiträge: 62
- Registriert: 13.09.2004 19:12:24
Beitrag
von Windmann » 28.10.2005 13:42:01
Danke funktioniert super!
Gibt es eigentlich auch eine Möglichkeit das Ergebnis weiter zu verarbeiten? Soweit ich weiß gibt es da soetwas wie eine for-Schleife.
Code: Alles auswählen
g120rw
g121rw
g122rw
g123rw
g110rw
g111rw
g601rw
g602rw
g603rw
Gibt es eine Möglichkeit an den String jeder Zeile Text anzuhängen oder voranzustellen?
Macht man soetwas mit einer for schleife?
Gruß Windmann
Debian Linux - Woody
-
eC
- Beiträge: 354
- Registriert: 24.07.2002 13:34:13
- Wohnort: karlsruhe
Beitrag
von eC » 28.10.2005 14:00:05
Windmann hat geschrieben: Danke funktioniert super!
Gibt es eine Möglichkeit an den String jeder Zeile Text anzuhängen oder voranzustellen?
Macht man soetwas mit einer for schleife?
Gruß Windmann
Gerne,
Du könntest das so machen (kein besonders schönes bsp
)
Code: Alles auswählen
for a in `cut -d ";" -f 4 datei.txt` ; do echo "anfang_"$a"_ende"; done;
gruss
eC
-
Windmann
- Beiträge: 62
- Registriert: 13.09.2004 19:12:24
Beitrag
von Windmann » 28.10.2005 14:21:23
Danke eC.
Irgendwas stimmt da bei mir noch nicht.
Code: Alles auswählen
for a in 'cut -d ";" -f 2 datei.txt'
do
echo "anfang_"$a"_ende"
done
Liefert bei mir :
Gruß,
Windmann
Debian Linux - Woody
-
Gharika
- Beiträge: 209
- Registriert: 28.09.2004 16:51:51
- Lizenz eigener Beiträge: GNU Free Documentation License
Beitrag
von Gharika » 28.10.2005 14:26:44
das ist ` nicht ein ' ... mal ganz groß ranzoomen
Acute-Zeichen heißt das glaube ich...
Zuletzt geändert von
Gharika am 28.10.2005 14:30:34, insgesamt 1-mal geändert.
Beleidigungen sind die Argumente derer, die unrecht haben.
-- Jean Jacques Rousseau
-
Windmann
- Beiträge: 62
- Registriert: 13.09.2004 19:12:24
Beitrag
von Windmann » 28.10.2005 15:58:30
Oje, oje, ... das ganze ist doch etwas komplizierter geworden.
Im Grunde bräuchte ich zwei getrennte Variablen.
1.Variable : X+1.Zeile in der 2. Spalte
2.Variable: X+1.Zeile in der 4.Spalte
Ich muß also aus der Tabelle im Grunde immer Pärchen aus einer Zeile auslesen und in Variablen setzen.
Wahnsinnig kniffelig!
Gruß Windmann
Debian Linux - Woody
-
gms
- Beiträge: 7798
- Registriert: 26.11.2004 20:08:38
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von gms » 29.10.2005 00:47:04
etwa so ?
Code: Alles auswählen
gms@gms1:~$ cat Datei.txt | while read line; do IFS=";" P=($line); echo ${P[0]} ${P[1]} ${P[2]} ${P[3]} ${P[4]} ${P[5]} ${P[6]}; done
FB Ordner Q-Dom G-Read G-Write G-Read G-Write
12 12.0 haus g120r g120rw g120r g120rw
12 12.1 haus g121r g121rw g121r g121rw
12 12.2 haus g122r g122rw g122r g122rw
12 12.3 haus g123r g123rw g123r g123rw
11 11.0 haus g110r g110rw g110r g110rw
11 11.1 haus g111r g111rw g111r g111rw
60 60.1 dom g601r g601rw g601r g601rw
60 60.2 dom g602r g602rw g602r g602rw
60 60.3 dom g603r g603rw g603r g603rw
Gruß
gms
-
Leonidas
- Beiträge: 2032
- Registriert: 28.04.2003 13:48:49
- Lizenz eigener Beiträge: MIT Lizenz
-
Kontaktdaten:
Beitrag
von Leonidas » 29.10.2005 18:24:52
Da würde es sich anbieten eine Skriptsprache wie Ruby, Perl oder Python zu benutzen, bei denen stetig steigenden Anforderungen, hehe.
Könntest du das mit dem
Windmann hat geschrieben:1.Variable : X+1.Zeile in der 2. Spalte
2.Variable: X+1.Zeile in der 4.Spalte
noch etwas genauer erklären?
Wir wollten einen Marsch spielen, aber wir hatten nur Xylophone.
-
Joghurt
- Beiträge: 5244
- Registriert: 30.01.2003 15:27:31
- Wohnort: Hamburg
-
Kontaktdaten:
Beitrag
von Joghurt » 29.10.2005 21:31:08
Mal so aus dem Stegreif
Code: Alles auswählen
#!/usr/bin/python
lst = []
for line in open("Datei.txt"):
lst.append(line.split(";"))
# jetzt zugreifbar als lst[zeile][spalte]
# z.B. sämtliche zeilen der zweiten Spalte, durch ; getrennt:
print [ x[2] for x in lst ]
-
Leonidas
- Beiträge: 2032
- Registriert: 28.04.2003 13:48:49
- Lizenz eigener Beiträge: MIT Lizenz
-
Kontaktdaten:
Beitrag
von Leonidas » 30.10.2005 13:11:28
Joghurt hat geschrieben:Mal so aus dem Stegreif
Python wollt ich doch machen!
Dann nehm ich halt Ruby:
Code: Alles auswählen
#!/usr/bin/env ruby
lst = []
while line = gets
lst << line.chomp().split(';')
end
lst.each {|x| puts x[2]}
Aufruf:
Das tolle ist, dass man auch direkt die Datei per Stdin reinfüttern kann:
Wir wollten einen Marsch spielen, aber wir hatten nur Xylophone.
-
gms
- Beiträge: 7798
- Registriert: 26.11.2004 20:08:38
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von gms » 30.10.2005 17:01:46
na dann sollte perl auch nicht fehlen:
Code: Alles auswählen
gms@gms1:~/test$ perl -ne 'chomp;my @p=split(";"); print "@p\n";' Datei.txt
FB Ordner Q-Dom G-Read G-Write G-Read G-Write
12 12.0 haus g120r g120rw g120r g120rw
12 12.1 haus g121r g121rw g121r g121rw
12 12.2 haus g122r g122rw g122r g122rw
12 12.3 haus g123r g123rw g123r g123rw
11 11.0 haus g110r g110rw g110r g110rw
11 11.1 haus g111r g111rw g111r g111rw
60 60.1 dom g601r g601rw g601r g601rw
60 60.2 dom g602r g602rw g602r g602rw
60 60.3 dom g603r g603rw g603r g603rw
auch hier kann selbstverständlich die Datei direkt über stdin gefüttert werden
Code: Alles auswählen
gms@gms1:~/test$ cat Datei.txt | perl -ne 'chomp;my @p=split(";"); print "@p\n";'
Gruß
gms
-
Windmann
- Beiträge: 62
- Registriert: 13.09.2004 19:12:24
Beitrag
von Windmann » 31.10.2005 08:27:45
Danke an Alle. Problem gelöst.
Habe jede Spalte der Tabelle über 'cut' in eine separate Datei extrahiert. Anschließend habe ich über Array Variablen den jeweiligen Dateiinhalt einer Spalte - Zeile für Zeile - dem zur Spalte passenden Array zugewiesen. Supergut!
Meine Arrays sind mit 'settype -a {variablenname}' gemacht.
Was in Perl 1 Zeile ist
ist in der Shell halt gleich mal ca. 2-3 Seiten
. Aber es geht!!!
Linux Skripte sind ganz schön mächtig! Für Stringbearbeitung ist aber halt nun mal Perl unschlagbar - ich weiß!
Grüße
PS: Was ist den 'ruby'?
Debian Linux - Woody
-
gms
- Beiträge: 7798
- Registriert: 26.11.2004 20:08:38
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von gms » 31.10.2005 15:24:18
Windmann hat geschrieben:Was in Perl 1 Zeile ist
ist in der Shell halt gleich mal ca. 2-3 Seiten
Ich habe deine Anforderung noch immer nicht ganz verstanden, aber meine beiden Onerliner tun das gleiche und sind nahezu gleich lang:
Code: Alles auswählen
gms@gms1:~$ cat Datei.txt | while read line; do IFS=";" P=($line); echo ${P[0]} ${P[1]} ${P[2]} ${P[3]} ${P[4]} ${P[5]} ${P[6]}; done
Code: Alles auswählen
gms@gms1:~/test$ perl -ne 'chomp;my @p=split(";"); print "@p\n";' Datei.txt
gms
-
Joghurt
- Beiträge: 5244
- Registriert: 30.01.2003 15:27:31
- Wohnort: Hamburg
-
Kontaktdaten:
Beitrag
von Joghurt » 31.10.2005 17:25:50
gms hat geschrieben:Ich habe deine Anforderung noch immer nicht ganz verstanden
Er wollte etwa folgendes haben:Eingabedatei:
Nun alle Zeilen der 2. Spalte als Ergebnis:
-
gms
- Beiträge: 7798
- Registriert: 26.11.2004 20:08:38
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von gms » 31.10.2005 18:34:58
den ersten Teil habe ich auch noch verstanden, mit den zwei Variablen bin ich mir aber nicht mehr sicher:
Windmann hat geschrieben:Im Grunde bräuchte ich zwei getrennte Variablen.
1.Variable : X+1.Zeile in der 2. Spalte
2.Variable: X+1.Zeile in der 4.Spalte
Das habe ich mir eigentlich so gedacht:
Ein Beispiel mit Spalte 2 und 4:
Code: Alles auswählen
gms@gms1:~/test$ cat Datei.txt | { read line; while read line; do IFS=";" P=($line); IFS=""; V1="$V1;${P[1]}"; V2="$V2;${P[3]}"; done; V1=${V1:1}; V2=${V2:1}; echo $V1; echo $V2; }
12.0;12.1;12.2;12.3;11.0;11.1;60.1;60.2;60.3
g120r;g121r;g122r;g123r;g110r;g111r;g601r;g602r;g603r
Gruß
gms