Spalten auslesen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Windmann
Beiträge: 62
Registriert: 13.09.2004 19:12:24

Spalten auslesen

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

Benutzeravatar
eC
Beiträge: 354
Registriert: 24.07.2002 13:34:13
Wohnort: karlsruhe

Re: Spalten auslesen

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

Code: Alles auswählen

man cut
Dein BSP sollte so gehen

Code: Alles auswählen

cut -d ";" -f 3,4 datei.txt
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

Benutzeravatar
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 :

Code: Alles auswählen

anfang_cut -d ";" -f 2 datei.txt_ende
Gruß,

Windmann
Debian Linux - Woody

Benutzeravatar
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 14:30:01

8O 8O 8O

Tatsächlich.....

:wink:

Danke Euch Beiden!
Debian Linux - Woody

Windmann
Beiträge: 62
Registriert: 13.09.2004 19:12:24

Beitrag von Windmann » 28.10.2005 15:58:30

:roll:

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

Benutzeravatar
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.

Benutzeravatar
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 ]

Benutzeravatar
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:

Code: Alles auswählen

ruby skript.rb Datei.txt
Das tolle ist, dass man auch direkt die Datei per Stdin reinfüttern kann:

Code: Alles auswählen

cat Datei.txt | ruby skript.rb
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 :roll:. Aber es geht!!!
Linux Skripte sind ganz schön mächtig! Für Stringbearbeitung ist aber halt nun mal Perl unschlagbar - ich weiß! :wink:

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

Benutzeravatar
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:

Code: Alles auswählen

AAA;111;aaa
BBB;222;bbb
CCC;333;ccc
DDD;444;ddd
Nun alle Zeilen der 2. Spalte als Ergebnis:

Code: Alles auswählen

111;222;333;444

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

Antworten