awk printf übergabe an sub - ich blicks ned

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
h4ppy
Beiträge: 51
Registriert: 03.06.2004 19:14:35
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Swiss

awk printf übergabe an sub - ich blicks ned

Beitrag von h4ppy » 08.06.2009 15:01:07

hallo,
kommen wir gleich zu sache.

Code: Alles auswählen

echo "zzz|xxx|yyy"| awk 'BEGIN { FS = OFS = "|"} {var1 = $1; var2 = $2; var3 = $3} {printf ("%s|%s\n",var1, var2) > sub(/zzz/, "fff");print}'
liefert folgende ausgabe bei mir.

Code: Alles auswählen

fff|xxx|yyy
Warum nimmt mein sub nicht den teilstring? Wie kann ich printf ausgabe zum dem sub umleiten?
denn wenn ich es in ein file umleite

Code: Alles auswählen

.......... var2) > "file.txt" }' 
kommt richtige ausgabe

Code: Alles auswählen

fff|xxx
.

wo ist der Wurm ?

PS: ich weiss dass es auch mit 'sed' geht, aber ich möchte es in awk lösen. Danke
Debian 7 + KDE
In der Kürze liegt die Würze - Wer Fehler findet, darf sie behalten.

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: awk printf übergabe an sub - ich blicks ned

Beitrag von Meillo » 08.06.2009 16:08:33

h4ppy hat geschrieben:Warum nimmt mein sub nicht den teilstring? Wie kann ich printf ausgabe zum dem sub umleiten?
`>' leitet in eine Datei um nicht in Kommandos. `|' leitet in (Shell-)Kommandos um (nicht aber in interne AWK-Kommandos). So geht es also nicht.
denn wenn ich es in ein file umleite

Code: Alles auswählen

.......... var2) > "file.txt" }' 
kommt richtige ausgabe

Code: Alles auswählen

fff|xxx
.
Klar, denn hier leitest du ja in eine Datei um.

Hier ein funktionierender (zudem vereinfachter) Code mit Hilfsvariable tmp gelöst:

Code: Alles auswählen

$ echo "zzz|xxx|yyy"| awk 'BEGIN { FS = "|"}    { tmp = $1 "|" $2;  sub(/zzz/, "fff", tmp);  print tmp; }'
Use ed once in a while!

Benutzeravatar
h4ppy
Beiträge: 51
Registriert: 03.06.2004 19:14:35
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Swiss

Re: awk printf übergabe an sub - ich blicks ned

Beitrag von h4ppy » 08.06.2009 18:58:38

danke Für dein Beispiel, bitte beachte aber !
ich habe extra 3 Variablen vorgegeben
Zweck: an Position XXX will ich nur 2 von 3 var ausgeben, und von den 2 eine Manipuliren (ersetzen).

deine Zeile erfüllt die Aufgabe nicht, denn: fügen wir

Code: Alles auswählen

"|" $3"
wird sub wider auf $0 angewendet.

Hast du noch andere Lösung vielleicht?
Debian 7 + KDE
In der Kürze liegt die Würze - Wer Fehler findet, darf sie behalten.

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: awk printf übergabe an sub - ich blicks ned

Beitrag von Meillo » 08.06.2009 19:09:13

h4ppy hat geschrieben:deine Zeile erfüllt die Aufgabe nicht, denn: fügen wir

Code: Alles auswählen

"|" $3"
wird sub wider auf $0 angewendet.
hä? sub() wird doch auf tmp angewendet.
Hast du noch andere Lösung vielleicht?
Wenn du mir genau erklären kannst was du willst, dann sicher. Bislang kappiere ich nicht so recht welches Problem du eigentlich lösen willst.

Du musst mir sagen was dein Problem ist, wie die Lösung sein muss und welche Rahmenbedinungen es gibt. Ein möglicher Lösungsansatz ist zwar ganz nett (und zeigt deine Bemühungen), führt aber leider oft auf falsche Fährten. Also, schildere bitte das Problem.

Ich helfe nur zu gerne! :-)
Use ed once in a while!

Benutzeravatar
h4ppy
Beiträge: 51
Registriert: 03.06.2004 19:14:35
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Swiss

Re: awk printf übergabe an sub - ich blicks ned

Beitrag von h4ppy » 08.06.2009 19:49:33

ist doch einfach,
3 variabeln, Tage Monate Jahre, und je nach bedarf von den welche für Ausgbe hollen und g.g.f verändern durch ersetzen.
beispiel ausgabe:
es sind noch 3 "<var1>Tage" bis zum Spiel, es ist der letzte <"sub (/Tage/, "Tag".>. des <"sub ("/Monate/Monat..) >
Zeit bis zu Sessionende "..$tmp"

Man könnte die vars vieleicht in arry schieben und dann halt eben var1,2 ,3 hollen und verändern
Debian 7 + KDE
In der Kürze liegt die Würze - Wer Fehler findet, darf sie behalten.

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: awk printf übergabe an sub - ich blicks ned

Beitrag von Meillo » 09.06.2009 18:35:11

h4ppy hat geschrieben:ist doch einfach,
3 variabeln, Tage Monate Jahre, und je nach bedarf von den welche für Ausgbe hollen und g.g.f verändern durch ersetzen.
beispiel ausgabe:
es sind noch 3 "<var1>Tage" bis zum Spiel, es ist der letzte <"sub (/Tage/, "Tag".>. des <"sub ("/Monate/Monat..) >
Zeit bis zu Sessionende "..$tmp"
Leider weiß ich jetzt auch nicht _ganz klar_ was gemeint ist. Die Erklärung verwirrt mich vor allem.
Mach doch mal Beispielfälle mit Beispieldaten (ohne Platzhalter oder so, sondern ganz konkrete Beispiele).
Man könnte die vars vieleicht in arry schieben und dann halt eben var1,2 ,3 hollen und verändern
Weshalb nicht einfach $1, $2, $3 verwenden?


Nochmal zu oben:
h4ppy hat geschrieben:ich habe extra 3 Variablen vorgegeben
Zweck: an Position XXX will ich nur 2 von 3 var ausgeben, und von den 2 eine Manipuliren (ersetzen).

deine Zeile erfüllt die Aufgabe nicht, denn: fügen wir

Code: Alles auswählen

"|" $3"
wird sub wider auf $0 angewendet.
Ich denke dass mein Code das schon kann.

Code: Alles auswählen

$ echo "zzz|xxx|yyy"| awk 'BEGIN { FS = "|"}    { tmp = $1 "|" $2 "|" $3;  sub(/zzz/, "fff", tmp);  print tmp; }'
Aber zeige mir Fälle in denen es nicht funktioniert.


Du musst mir quasi eine Testsuite liefern. (D.h. gegebener Input und gewünschter Output.) Ich schreibe dir dann einen Code der alle Tests erfolgreich besteht.
Use ed once in a while!

Benutzeravatar
h4ppy
Beiträge: 51
Registriert: 03.06.2004 19:14:35
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Swiss

Re: awk printf übergabe an sub - ich blicks ned

Beitrag von h4ppy » 09.06.2009 20:28:56

Ich habe es gelöst

Code: Alles auswählen

happy@data:/home# echo "zzz|xxx|yyy"| awk 'BEGIN { FS = OFS = "|"} { var1 = $1; var2 = $2; var3 = $3 } { gsub (/zzz/, "fff", var1); printf ("%s,%s\n",var1,var2);} {print}'
fff,xxx
zzz|xxx|yyy
Fertig


bei deiner Variante, ich weis nicht warum , aber gsub nimmt immer die globale variable. (ohne tmp. den ich will nur die $1 bearbeiten)

Code: Alles auswählen

happy@data:/home# echo "zzz|xxx|yyy"| awk 'BEGIN { FS = OFS = "|"} {  $1 "|" $2 "|" $3 } { gsub (/zzz/, "fff", $1); printf ("%s,%s\n",$1,$2);} {print}'
fff,xxx
fff|xxx|yyy
Gruss
Debian 7 + KDE
In der Kürze liegt die Würze - Wer Fehler findet, darf sie behalten.

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: awk printf übergabe an sub - ich blicks ned

Beitrag von Meillo » 10.06.2009 09:27:49

h4ppy hat geschrieben:Ich habe es gelöst

Code: Alles auswählen

happy@data:/home# echo "zzz|xxx|yyy"| awk 'BEGIN { FS = OFS = "|"} { var1 = $1; var2 = $2; var3 = $3 } { gsub (/zzz/, "fff", var1); printf ("%s,%s\n",var1,var2);} {print}'
fff,xxx
zzz|xxx|yyy
Fertig


bei deiner Variante, ich weis nicht warum , aber gsub nimmt immer die globale variable. (ohne tmp. den ich will nur die $1 bearbeiten)

Code: Alles auswählen

happy@data:/home# echo "zzz|xxx|yyy"| awk 'BEGIN { FS = OFS = "|"} {  $1 "|" $2 "|" $3 } { gsub (/zzz/, "fff", $1); printf ("%s,%s\n",$1,$2);} {print}'
fff,xxx
fff|xxx|yyy
Scheint als ob $1 nur eine Referenz auf einen Teil von $0 ist. Somit beinflusst das eine auch das andere.

Wenn du in einer Zeile die Orginalzeile mehrfach anders bearbeiten willst, dann brauchst du natürlich deine Variablen wobei die Frage ist, ob die Ersetzungen überhaupt nötig sind, falls sie so simpel sind wie in diesem Beispiel. Alternativ könnte man auch einfach einen anderen Text ausgeben ohne die Orginalzeile zu verändern:

Code: Alles auswählen

$ echo "zzz|xxx|yyy"| awk 'BEGIN { FS = OFS = "|"} { printf ("%s,%s\n", ($1~/zzz/)?"fff":$1, $2); print }'
fff,xxx
zzz|xxx|yyy
Use ed once in a while!

Antworten