awk Darstellungsproblem, Zeichen überschneiden sich

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Spagetti
Beiträge: 22
Registriert: 05.11.2005 10:41:34

awk Darstellungsproblem, Zeichen überschneiden sich

Beitrag von Spagetti » 21.12.2005 13:00:54

Hi

bei einer Konvertierung mit sed bekomme ich folgenden output

Code: Alles auswählen

sed '{s/contextPosition="/ (/g;s/">/) {/g;s/</} /g;s/attribute>/ \\uput[90]/g;s/object>/ \\uput[-90]/g}' tmp.objAtrNamePos
 (1) {Struppi} / \uput[-90][/list]
 (2) {Daisy} / \uput[-90]
 (0) {Tim} / \uput[-90]
 (0) {DM} / \uput[90]
 (4) {m} / \uput[90]
 (3) {3} / \uput[90]
 (1) {1} / \uput[90]
 (5) {w} / \uput[90]
 (2) {2} / \uput[90]
jetzt möchte ich die Felder umordnen so dass ich folgende Form erhalte:
\uput[-90](1){Struppi}
Das wollte ich mit awk '{print $4 $2 $1}' umordnen aber folgendes kommt dabei raus

Code: Alles auswählen

sed '{s/contextPosition="/ (/g;s/">/) {/g;s/</} /g;s/attribute>/ \\uput[90]/g;s/object>/ \\uput[-90]/g}' tmp.objAtrNamePos | awk '{print $4 $2 $1}'

{Struppi}(1)
{Daisy}(2)
{Tim}(0)0]
{DM}(0)0]
{m}(4)90]
{3}(3)90]
{1}(1)90]
{w}(5)90]
{2}(2)90]
Hat jemande eine Idee warum das nicht funktioniert ??

Spageti :roll:

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 21.12.2005 13:19:40

vermutlich hast du Sonderzeichen drinnen

Code: Alles auswählen

gms@gms1:~$ cat x.txt
 (1) {Struppi} / \uput[-90][/list]
 (2) {Daisy} / \uput[-90]
 (0) {Tim} / \uput[-90]
 (0) {DM} / \uput[90]
 (4) {m} / \uput[90]
 (3) {3} / \uput[90]
 (1) {1} / \uput[90]
 (5) {w} / \uput[90]
 (2) {2} / \uput[90]
gms@gms1:~$ awk '{ print $4 $1 $2 }' x.txt
\uput[-90][/list](1){Struppi}
\uput[-90](2){Daisy}
\uput[-90](0){Tim}
\uput[90](0){DM}
\uput[90](4){m}
\uput[90](3){3}
\uput[90](1){1}
\uput[90](5){w}
\uput[90](2){2}

[edit]
ursprünglichen Beitrag irrtümlich überschrieben :oops:
[/edit]
Zuletzt geändert von gms am 21.12.2005 13:29:58, insgesamt 3-mal geändert.

Spagetti
Beiträge: 22
Registriert: 05.11.2005 10:41:34

Beitrag von Spagetti » 21.12.2005 13:24:14

Das funktioniert bei mir auch nicht, aber vieleicht liegts ja daran dass Du die Daten vorher in einer Datei stehen hattest. Ich werde die Daten mal in einer Datei zwischenspeichern und dann nochmal awk draufloslassen.
Ich sage bescheid

:D

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 21.12.2005 13:28:06

Oops, habe irrtümlich meinen obigen Beitrag editiert

Die Datei kannst du dir dann gleich einmal mit einem Hexeditor anschauen

Verwurschtelst du hier eine xml Datei? Dafür wäre xsltproc,..etc besser geeignet

Gruß
gms

Spagetti
Beiträge: 22
Registriert: 05.11.2005 10:41:34

Beitrag von Spagetti » 21.12.2005 13:31:17

Die Datei ist xml-mässig aufgebaut, hat aber die Endung .csx.
Ich schreibe einen Codekonvertierer.
Wieso was kann ich den mit xsltproc machen ??

Spagetti
Beiträge: 22
Registriert: 05.11.2005 10:41:34

Beitrag von Spagetti » 21.12.2005 13:39:54

erwurschtelst du hier eine xml Datei? Dafür wäre xsltproc,..etc besser geeignet
@gms
Hi,
ich habe hier mal einen Auschnitt der Datei

Code: Alles auswählen

<objectLabelStyle>
                <offset x="0.0" y="0.0" />
                <backgroundColor>#ffffffff</backgroundColor>
                <textColor>#ff000000</textColor>
                <textAlignment>left</textAlignment>
            </objectLabelStyle>
            <concept>
                <objectContingent />
                <attributeContingent>
                    <attribute contextPosition="0">DM</attribute>
                    <attribute contextPosition="4">m</attribute>
                </attributeContingent>
            </concept>
            <ndimVector>
                <coordinate>1.0</coordinate>
                <coordinate>1.0</coordinate>
                <coordinate>0.0</coordinate>
            </ndimVector>
        </node>
        <node id="1">
ich brauche aus dieser Datei Werte wie z.B.
contextPosition="0
oder
DM</attribute>
Schreibe das Konvertierungsscript in bash mit awk, sed, grep.
Soll ein LateX-code draus werden. Geht es denn einfacher mit anderen Werkzeugen, oder was hast du gemeint ??

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 21.12.2005 14:35:44

bei xml Dateien ist die Formatierung (Whitespaces) zwischen den Elementen und Attributen undefiniert. Daher ist auch eine Verarbeitung mit awk, sed, grep sehr schwer. Wird die XML Datei von einem Fremdprogramm generiert und läßt sich daher eine spezielle Formatierung nicht erzwingen, kann die Ausgabe bei der nächsten Programmversion wieder völlig anders ausschauen.
Mit xslt-Stylesheets werden XML Dateien unter Berücksichtigung der XML Elemente/Attribute und unabhängig von der Formatierung transformiert.
Wenn du möchtest poste einmal die ganze Datei (auf NoPaste!!!), ich kann dir dann heute abend ein kleines XSLT Stylesheet erzeugen.
Wenn du dich vorher selber schlau machen möchtest:
http://www.w3schools.com/xsl/xsl_languages.asp
http://www.w3schools.com/xsl/default.asp

Gruß
gms

Spagetti
Beiträge: 22
Registriert: 05.11.2005 10:41:34

Beitrag von Spagetti » 21.12.2005 14:43:15

Gerne, danke für das Angebot.
Aber was um Himmels willen ist nopaste ??

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 21.12.2005 14:50:28

Siehe "wichtiger Hinweis" ganz oben, wenn du einen Beitrag schreibst:

- Lange Codezeilen/Logs gehören nach NoPaste, in Deinen Beitrag dann der passende Link dazu.

http://nopaste.debianforum.de/

Spagetti
Beiträge: 22
Registriert: 05.11.2005 10:41:34

Beitrag von Spagetti » 21.12.2005 15:05:52

Ok,
die Quelle hab ich hier gepostet, ist tatsächlich xml wie Du der ersten Zeile entnehmen kannst.
Quelle:
http://nopaste.debianforum.de/1899

Ziel:
http://nopaste.debianforum.de/1900

"Quelle" soll also in "Ziel" konvertiert werden. Wobei noch ein paar kleine Fehler im oben gepostet "Ziel" sind, die aber momentan vernachlässigbar sind. ("Ziel" ist mit dem Script von mir aus "Quelle" enstanden)

Vielen Dank schon mal

Spagetti :-)

P.S.: ich habe teilweise die Nummerierungen in "Quelle"
0 1 2 3 4 5 6 ....
auf
A B C D E F ....
im "Ziel" abbilden müssen.

Beispiel :

Code: Alles auswählen

#
<node id="0">
#
<position x="-389.4052166047521" y="732.0818072169341" />
wurde zu

Code: Alles auswählen

\Cnode(-389.4052166047521,732.0818072169341){A} 
aus node id="0" wurde also {A}

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 21.12.2005 16:31:35

für das Mapping 0->A, 1->B .. habe ich noch keine elegante Lösung, notfalls muß das mit "xsl:choose" implementiert werden.

für diese Zeile in deinem Ziel Dokument habe ich noch keine Erklärung:

Code: Alles auswählen

\ncline{E}{A} \ncline{A}{B} \ncline{B}{C} \ncline{D}{C} \ncline{F}{C} \ncline{E}{D} \ncline{A}{F} 
Sind die 90 und -90 fix, je nachdem ob es vom XML Element "object" oder "attribute" kommt ?

Ich habe jetzt einmal folgendes XSLT Stylesheet erstellt: http://nopaste.debianforum.de/1902 erstellt

wurde hier als 1899.xsl abgespeichert und über folgende Kommandozeile wurde das 1899.xml verwurschtelt:

Code: Alles auswählen

gms@gms1:~$ xsltproc 1899.xsl 1899.xml
\Cnode{-389.4052166047521,732.0818072169341}{0}
\Cnode{-470.99503616563203,824.2413132898561}{1}
\Cnode{-311.5241732838017,996.8773545081656}{2}
\Cnode{-156.998345388544,824.2413132898561}{3}
\Cnode{-295.94796461961164,638.6245552317935}{4}
\Cnode{-311.5241732838017,825.5390592020746}{5}
\uput[-90] {1}{Struppi}
\uput[-90] {2}{Daisy}
\uput[-90] {0}{Tim}
\uput[90] {0}{DM}
\uput[90] {4}{m}
\uput[90] {3}{3}
\uput[90] {1}{1}
\uput[90] {5}{w}
\uput[90] {2}{2}
Gruß
gms

[edit]
Ich bin leider auch nicht sehr geübt XSLT Stylesheets zu schreiben. Mit ein Grund warum ich mich hier so bereitwillig angeboten habe :wink:
Daher sind auch Kritiken am Code herzlich willkommen!
[/edit]

Spagetti
Beiträge: 22
Registriert: 05.11.2005 10:41:34

Beitrag von Spagetti » 21.12.2005 16:42:59

Hey wow,
ist ja beindruckend !!
Ich war wohl völlig auf dem falschen Damper.

Dieser Codefetzen kann auch

Code: Alles auswählen

\ncline{E}{A} \ncline{A}{B} \ncline{B}{C} \ncline{D}{C} \ncline{F}{C} \ncline{E}{D} \ncline{A}{F} 
so aussehen, das spielt keine Rolle

Code: Alles auswählen

\ncline{E}{A} 
\ncline{A}{B} 
\ncline{B}{C} 
\ncline{D}{C} 
\ncline{F}{C} 
\ncline{E}{D} 
\ncline{A}{F} 
Diese Codeabschnitte entstehen übrigens aus folgender
Quelle:

Code: Alles auswählen

 <edge from="4" to="0" />
        <edge from="0" to="1" />
        <edge from="1" to="2" />
        <edge from="3" to="2" />
        <edge from="5" to="2" />
        <edge from="4" to="3" />
        <edge from="0" to="5" />

wobei wieder "Quelle"
0 1 2 3 4 5 6 ....
auf
A B C D E F ....
im "Ziel" abgebildet wird.


Hey Du bist mir wirklich ne riesen Hilfe, danke !!

Spagetti
Beiträge: 22
Registriert: 05.11.2005 10:41:34

Beitrag von Spagetti » 21.12.2005 16:45:41

Sind die 90 und -90 fix, je nachdem ob es vom XML Element "object" oder "attribute" kommt ?
Ja, das stimmt !

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 21.12.2005 16:56:01

habe ich jetzt angepaßt
http://nopaste.debianforum.de/1903

fehlt nur noch dieses Mapping, bin aber jetzt ein paar Stunden auf einer Kindergeburtstagsparty :cry:

Gruß
gms

Spagetti
Beiträge: 22
Registriert: 05.11.2005 10:41:34

Beitrag von Spagetti » 21.12.2005 17:00:49

Die ungenauigkeit von der ich in einem der obigen Posts gesprochen habe
Wobei noch ein paar kleine Fehler im oben gepostet "Ziel" sind, die aber momentan vernachlässigbar sind. ("Ziel" ist mit dem Script von mir aus "Quelle" enstanden)
ist die folgende
Quelle:

Code: Alles auswählen

<node id="1">
      .......
     <concept>
        <objectContingent>
           <object contextPosition="1">Struppi</object>
        </objectContingent>
        <attributeContingent>
          <attribute contextPosition="3">3</attribute>
        </attributeContingent>
     </concept>
ich habe leider nur dieses "Ziel" mit Bashmitteln zustande bekommen


Code: Alles auswählen

\uput[-90](B){Struppi}  
wobei es eigentlich lauten sollte

Code: Alles auswählen

\uput[-90](B){Struppi}  
\uput[90](B){3}  
(B) korrespondiert dabei mit <node id="1"> und !nicht! mit <attribute contextPosition="3"

ich weiß nicht ob das problematisch zu realisieren ist mit einem xsl template ??
Zuletzt geändert von Spagetti am 21.12.2005 17:13:14, insgesamt 1-mal geändert.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 21.12.2005 17:10:57

ist einfach, ist das "{3}" wieder fix ? ist das auch bei den "attribute" Elementen notwendig ?

Spagetti
Beiträge: 22
Registriert: 05.11.2005 10:41:34

Beitrag von Spagetti » 21.12.2005 17:28:03

gms hat geschrieben:ist einfach, ist das "{3}" wieder fix ? ist das auch bei den "attribute" Elementen notwendig ?
Ja, die >3< bzw. {3} ist fix

Das besagte Mapping ist nur für folgende Ausdrücke

Code: Alles auswählen

<node id="1">     wird zu    \Cnode(..,..){A}  bzw. \uput[..](A){..}
<edge from="0" to="1" /> wird zu    \ncline{A}{B}
Falls das mit dem Mapping mit xsltproc nicht klappt dann kann ich auch ein Teil von meinem Script dafür verwenden. Es wäre dann allerings gut wenn
1, 2, 3, ... von besonderen Zeichen umrandet wäre. Z.B. so
\Cnode(..,..){%1%}
denn es sind ja noch andere Zahlen im Text.
Tausend Dank !!!!

:-) Spagetti :-)

Spagetti
Beiträge: 22
Registriert: 05.11.2005 10:41:34

Beitrag von Spagetti » 21.12.2005 20:49:29

Ich hab mal ein bisschen weitergebastelt, aber es funzt nicht

http://nopaste.debianforum.de/1907

ich bin aber auch so mattgefönt das nix mehr geht. :hail:

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 21.12.2005 23:00:40

Ich habe mir kurz dein Stylesheet angeschaut.
Ein XSL Stylesheet ist auch ein gültiges XML und braucht daher ein Wurzelelement:

Code: Alles auswählen

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

</xsl:stylesheet>
Weiters hast du verschachtelte <xsl:template> Elemente drinnen, das funktioniert so nicht, verwende "call-template", bzw "apply-templates". Die erste "for-each" gehört wiederum in ein <xsl:template>-Element.

Meine Empfehlung: Fange mit einem Ministylesheet an und baue es langsam aus, dann ist es ganz einfach zu erlernen.

Beim Mapping habe ich es jetzt mit der XPath Funktion "codepoints-to-string" versucht, das wäre ganz genau das was wir brauchen, nur ist diese XPATH 2.0 Funktion anscheinend weder in xsltproc noch in xalan implementiert.

Fürs erste habe ich daher diese Zeichen mit '%' maskiert.
http://nopaste.debianforum.de/1910 liefert jetzt folgenden Output:

Code: Alles auswählen

gms@gms1:~$ xsltproc 1899.xsl 1899.xml
\Cnode{-389.4052166047521,732.0818072169341}{%0%}
\Cnode{-470.99503616563203,824.2413132898561}{%1%}
\Cnode{-311.5241732838017,996.8773545081656}{%2%}
\Cnode{-156.998345388544,824.2413132898561}{%3%}
\Cnode{-295.94796461961164,638.6245552317935}{%4%}
\Cnode{-311.5241732838017,825.5390592020746}{%5%}
\ncline{%4%}{%0%}
\ncline{%0%}{%1%}
\ncline{%1%}{%2%}
\ncline{%3%}{%2%}
\ncline{%5%}{%2%}
\ncline{%4%}{%3%}
\ncline{%0%}{%5%}
\uput[-90] {1}{Struppi}
\uput[90] {1}{3}
\uput[-90] {2}{Daisy}
\uput[90] {2}{3}
\uput[-90] {0}{Tim}
\uput[90] {0}{3}
\uput[90] {0}{DM}
\uput[90] {4}{m}
\uput[90] {3}{3}
\uput[90] {1}{1}
\uput[90] {5}{w}
\uput[90] {2}{2}


Gruß
gms

Spagetti
Beiträge: 22
Registriert: 05.11.2005 10:41:34

Beitrag von Spagetti » 22.12.2005 10:00:53

Ok, danke für die Tips, werde mich jetzt nochmal ranmachen.

Eins verstehe ich in Deinem Script nicht, es ist dieser Abschnitt:

Code: Alles auswählen

<xsl:template match="*|@*|node()">
  <xsl:apply-templates/>
</xsl:template>
Was macht dieses Template ?? Ich mein, das wird ja nicht mal aufgerufen ?

!! Danke !!

Spagetti :-)

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 22.12.2005 18:25:44

Das war mir gestern auch noch nicht so ganz klar :)
Ich hatte das Problem, daß mir ohne diesem Template "zu viel" ausgegeben wurde. Mit diesem Template habe ich dann herumexperimentiert. Zuerst alle Elemente "*" ausgewählt, danach alle Attribute "@*" und weil ich diese unerwünschte Ausgabe noch immer hatte, habe ich dann aus Verzweiflung "node()" (also alles) hinzugefügt. Damit hat es dann auch funktioniert.
Dank deiner Frage bin ich der Sache jetzt weiter auf dem Grund gegangen. Anscheinend werden alle Textnodes "defaultmäßig" ausgegeben. Daher würde ein "text()" als Matchkriterium hier eigentlich genügen.
Spagetti hat geschrieben: Ich mein, das wird ja nicht mal aufgerufen ?
aufgerufen wird es indirekt durch "apply-templates". Durch dieses werden die Nodes "unterhalb" abgearbeitet bis ein Matchkriterium zutrifft. Daher wurde diese Template bei jeder Node aufgerufen und hat dann wiederum "apply-templates" aufgerufen



Gruß
gms

ToPeG
Beiträge: 437
Registriert: 14.04.2004 00:42:06

Beitrag von ToPeG » 23.12.2005 03:10:38

Entschuldige, das ich mich hier einmische, aber ich konnte mich nicht bremsen und hab' kurz einen Konverter in Perl geschrieben.
Ich weiß das er nicht gebraucht wird, aber es wäre schade ihn nicht zu posten. :-)

http://nopaste.debianforum.de/1921
Ich benutze das Modul "XML::Simple" um das XML zu lesen. (Paketname: libxml-simple-perl)

Aufruf:

Code: Alles auswählen

perl 1921 1899.xml
oder wenn die Auführrechte gesetzt wurden:

Code: Alles auswählen

1921 1899.xml

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 23.12.2005 16:18:11

ToPeG hat geschrieben: Ich weiß das er nicht gebraucht wird, aber es wäre schade ihn nicht zu posten. :-)
Sicher wäre das schade. Perl oder Python ist sicher mächtiger als XSLT und für mich persönlich ist Perl überhaupt die bevorzugte Scriptsprache.
Ich würde daher auch deine Lösung nehmen.

Gruß
gms

Spagetti
Beiträge: 22
Registriert: 05.11.2005 10:41:34

Beitrag von Spagetti » 28.12.2005 09:37:24

Hi,
ich wollte mich nochmal für die Hilfe bedanken !! Vor allem bei gms !!

Das mit dem Perlscript ist wirklich eine gute Idee, den ich interessiere mich schon lange für diese Sprache. Ich hatte allerdings noch keine Zeit mich einzuarbeiten und fand auch nicht die richtigen Argumente die für diese Sprache sprechen.
Ich werde mir dieses Script auf jeden Fall mal in Ruhe anschauen. Danke !

Spagetti :-)

Antworten