Liste auslesen

Hallo,

ich habe eine Liste mit verschiedenen Tabellensets (bsp.)

[set1]
tab1,
tab2,
tab3

[set2]
tab1,
tab5,
tab6,
tab10,
tab25

[set3]
.
.
.

diese Liste möchte ich jetzt auslesen, so das ich nachher nur z.B. set2 in einer Variablen habe.

Die Liste kann vom Layout her geändert werden (z.B. set1_start und set1_end) oder sonstige Anfangs und Endpunkte, die Tabellen mit oder ohne Komma…)

Aber wie frage ich das ab ?
Die Zeilenumbrüche bekomme ich mit tr -d \012 weg, aber wie bringe ich die Ausgabe dazu mir dann nur den String von „set2“ bis „leerzeichen/irgendein Sonderzeichen“ auszugeben ?

Im moment wühle ich mich durch ein Buch über awk, aber wenn das ne einfache Sache ist, dann wäre ich über eine Lösung sehr dankbar. Bis ich die richtigen Befehle gefunden habe kann´s dauern…

Grüße

Chris

Hallo Chris,

diese Liste möchte ich jetzt auslesen, so das ich nachher nur
z.B. set2 in einer Variablen habe.

Die Liste kann vom Layout her geändert werden (z.B. set1_start
und set1_end) oder sonstige Anfangs und Endpunkte, die
Tabellen mit oder ohne Komma…)

Kann die Liste auch so geändert werden?
[set1] tab1, tab2, tab3
[set2] tab1, tab5, tab6, tab10, tab25
[set3] tab…
würde die Sache stark vereinfachen…

Viele Grüße
Marvin

Hallo Chris,

ich habe eine Liste mit verschiedenen Tabellensets (bsp.)
[set1]
tab1,
tab2,
tab3

[set2]

diese Liste möchte ich jetzt auslesen, so das ich nachher nur
z.B. set2 in einer Variablen habe.

Probiere mal

sed -n -e '/set1/,//p'

Bei der Endbegrenzung (dem zweiten //) bin ich mir jetzt nicht sicher, ob da nicht besser /^$/ (also die eere Zeile) stehen müsste.
im Prinzip gibt sed -n -e ‚/BEGIN/,/END/p‘ alles Zeilen ab dem regulären Ausdruck /BEGIN/ bis zum regulären Ausdruck /END/ aus.
Habe leider gerade kein sed da, um das zu testen. Müsste aber vom Prinzip her funktionieren (eventuell die Begrenzer noch irgendwie anpassen usw.)
Kann sein, daß awk ein ähnliches Prinzip hat, das wäre dann noch einfacher…

Ich weiss nicht, ob ich mich verständlich genug ausgedrückt habe?

Viele Grüße
Marvin

Aller guten Dinge sind 3
Hallo Chris,
nachdem ich wieder an sed und awk komme und so festgestellt habe, daß ich bisher nur Murks abgeliefert habe, nun endlich eine awk-Lösung die funktioniert (zumindest bei mir):

BEGIN {
RS = ""
}
/set2/,// {print}

gibt bei mir auf deine Tabelle angewandt (steht hier in der Datei /dev/shm/set.txt):

kb@etch:~$ a=`awk -f /dev/shm/set.awk /dev/shm/set.txt`
kb@etch:~$ echo $a
[set2] tab1, tab5, tab6, tab10, tab25

Dies ist hoffentlich das gewünschte…

Natürlich muss im awk-Skript das feste set2 noch durch eine Variable ersetzt werden, die dann z.B. per Kommandozeile an das awk-Skript übergeben wird, aber diese Kleinigkeit überlasse ich jetzt dir.

Viele Grüße
Marvin

Hallo Marvin,

danke dir, klappt leider nicht ganz

wenn ich deinen Vorschlag so verwende, dann kommt

awk: syntax error near line 4
awk: bailing out near line 4

Das geht nur wenn in der set.txt nach jedem Set eine definierte END- Markierung ist

Ich hatte auch schon weiter experimentiert:

awk ’ /set2/,/END/’ set.txt
Funktioniert genauso wie deines - vorausgesetzt ich schreibe das benötigte Set direkt in den Befehl.

Was ich überhaupt nicht hinbekomme ist das ich den Setnamen per Variable übergebe.
Direkt hinter den Befehl und dann mit $1 im Script, klappt nicht,
als Variable exportiert und dann mit $var im Script - kommt nicht an…

Was auch noch nicht paßt ist das der Setname und die END-Markierung mit ausgegeben werden, die muß ich auch noch abschneiden.

Grüße

Chris

Hallo Chris,
jetzt nur ganz kurz als Rückmeldung.

wenn ich deinen Vorschlag so verwende, dann kommt
awk: syntax error near line 4
awk: bailing out near line 4

welchen awk und welches Linux benutzt Du denn? Bei mir kommt kein Syntaxfehler und ich wüsste im Moment auch nicht, wo da einer sein sollte. Hast Du dich vielleicht irgendwo verschrieben?

Was ich überhaupt nicht hinbekomme ist das ich den Setnamen
per Variable übergebe.
Direkt hinter den Befehl und dann mit $1 im Script, klappt
nicht,
als Variable exportiert und dann mit $var im Script - kommt
nicht an…
Was auch noch nicht paßt ist das der Setname und die
END-Markierung mit ausgegeben werden, die muß ich auch noch
abschneiden.

Na, das werden wir doch gemeinsam hinbekommen. Für die Ausgabe des Setnamens hatte ich mir gedacht, daß man die anschliessend mit sed weglöscht, so als ersten Denkansatz, sind ja beide bekannt. Im Moment komme ich aber noch nicht dazu, kann schon heute nachmittag oder abend werden. Ich hoffe, es eilt nicht zu sehr.
Mein erster Ansatz, die Sets zeilenweise zu organisieren, läßt sich wohl nicht machen?
Also so:
[set1] tab2, tab3, tab5
[set2] tab4, tab8…
wobei Kommas, Semikolons, Tabulatoren, oder sonst was als Trennzeichen egal wären.

Viele Grüße
Marvin

Hallo Chris,
hier mein neuer Lösungsansatz:
Als erstes habe ich die Datei, in der die Sets und Tabs stehen etwas verändert:

tab1,
tab2,
tab3


tab1,
tab5,
tab6,
tab10,
tab25


tab3,
tab5,
tab6,
tab9

einfach nur, weil die eckigen Klammern in awk eine spezielle Bedeutung haben und es so einfacher mit der Parameterübergabe funktioniert. Du kannst statt auch nur setX nehmen oder +setX+, was auch immer, aber [setX] war gerade sehr ungünstig. Ich hoffe, das ist machbar.
Jetzt das modifizierte Shell-Skript:

#!/bin/bash
awk -v anf=$1 'BEGIN { RS="" 
}
 
{ if ($0~anf) for (i = 2; i 

wenn Du das z.B. set nennst, ausführbar machst (chmod +x) kannst Du das mit



    ./set ""



oder gleich mit



    variable=`./set ""`



aufrufen:



    kb@etch:~/work/set$ variable=`./set ""`
    kb@etch:~/work/set$ echo $variable
    tab1, tab2, tab3



Das ist natürlich ohne Fehlerüberprüfung und die tabs sind hier in einer Datei namens setfile.txt abgespeichert.
Eventuell noch shebang #! anpassen und das Skript verfeinern...
Die Parameterübergabe bei awk funktioniert mit -v parameter=wert, so könnte man z.B. auch den Filenamen mit den tabs übergeben. Ich habe alles in ein bashskript gepackt, du kannst das auch auseinandernehmen, wie es di besser gefällt.
Der Syntaxfehler kam wahrscheinlich davon, daß ich zwischen { und print kein Leerzeichen gelassen habe, das war bei früheren Versionen von awk Pflicht. Ich hoffe, daß dies die Ursache war. Was ich sonst noch geändert habe, erschliesst sich dir hoffentlich von selbst, so war z.B. mein erster Ansatz mit /begin/,/end/ überflüssig, weil das schon durch RS="" erledigt wird, daß awk alles bis zu einer Leerzeile in sein internes Array einliest.

Viele Grüße
Marvin
1 Like

Hallo,

ich habe eine Liste mit verschiedenen Tabellensets (bsp.)

[set1]
tab1,
tab2,
tab3

[set2]
tab1,
tab5,
tab6,
tab10,
tab25

[set3]
.
.
.

diese Liste möchte ich jetzt auslesen, so das ich nachher nur
z.B. set2 in einer Variablen habe.

Die Liste kann vom Layout her geändert werden (z.B. set1_start
und set1_end) oder sonstige Anfangs und Endpunkte, die
Tabellen mit oder ohne Komma…)

Aber wie frage ich das ab ?
Die Zeilenumbrüche bekomme ich mit tr -d \012 weg, aber wie
bringe ich die Ausgabe dazu mir dann nur den String von „set2“
bis „leerzeichen/irgendein Sonderzeichen“ auszugeben ?

Ich verstehe nicht ganz, wie Dein
Endergebnis genau aussehen soll und
wie Du welche Parameter verwenden
willst. Schreib doch mal die
„Idealvariante“ von Kommandoaufruf
und Endergebnis (ohne das dies funktio-
niert), damit man einen Anhaltspunkt hat.

Grüße

CMБ

Hallo Marvin,

Ich danke dir vielmals !!!

Ich hätte noch erwähnen sollen - ich arbeite unter Solaris 10.
Aber dein Script - ein bißchen angepaßt - läuft jetzt.

#!/bin/ksh

nawk -v anf=$1 'BEGIN{RS=""}
{if($0~anf)
{
for(i=2;i