awk printf syntax

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
speefak
Beiträge: 532
Registriert: 27.04.2008 13:54:20

awk printf syntax

Beitrag von speefak » 18.11.2018 14:46:34

Hallo, ich suche folgende Lösung :

Code: Alles auswählen

echo 101 202 303 | awk -F " " '{printf "+" $1 }'
gibt Feld 1, also 101 aus

Nun habe ich allerdings für das Ausgabefeld eine Variable VAR=<WERT> ( bsp: VAR=2 )
wie kann ich nun die Variable VAR in das printf Feld einsetzen :

Code: Alles auswählen

echo 101 202 303 | awk -F " " '{printf "+" $$VAR }'
sodass die printf Ausgabe von Feld 2, für o.g. Bsp also 202 ausgeben wird.

Huo
Beiträge: 778
Registriert: 26.11.2017 14:03:31
Wohnort: Freiburg

Re: awk printf syntax

Beitrag von Huo » 18.11.2018 14:55:19

Ich mach das immer so:

Code: Alles auswählen

echo 101 202 303 | awk -F " " -v var=$VAR '{printf "+" $var}'
Nachtrag: Ginge aber, wie ich eben nach einigem Experimentieren bemerke, auch so:

Code: Alles auswählen

echo 101 202 303 | awk -F " " '{printf "+" $'$VAR' }'
So gesehen, hättest Du nur zwei Quotes vergessen. :)

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

Re: awk printf syntax

Beitrag von Meillo » 18.11.2018 16:03:59

Huo hat geschrieben: ↑ zum Beitrag ↑
18.11.2018 14:55:19

Code: Alles auswählen

echo 101 202 303 | awk -F " " '{printf "+" $'$VAR' }'
So gesehen, hättest Du nur zwei Quotes vergessen. :)
Nein, vier Quotes:

Code: Alles auswählen

echo 101 202 303 | awk -F " " '{printf "+" $'"$VAR"' }'
;-)
Use ed once in a while!

Benutzeravatar
speefak
Beiträge: 532
Registriert: 27.04.2008 13:54:20

Re: awk printf syntax

Beitrag von speefak » 18.11.2018 20:02:33

Die verfluchten quotes immer :facepalm:

Doppelqutes hatte ich auch schon ;) Gibt es da eine Möglichkeit das mal allgemeingültig in den Kopf zu bekommen.

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

Re: awk printf syntax

Beitrag von Meillo » 18.11.2018 20:48:05

speefak hat geschrieben: ↑ zum Beitrag ↑
18.11.2018 20:02:33
Gibt es da eine Möglichkeit das mal allgemeingültig in den Kopf zu bekommen.
Ja, gibt es. Wie du es bei dir hinbekommst, kann ich nicht sagen. ;-) Vermutlich wirst du dich dazu aber mal genauer damit beschaeftigen muessen.

Hier ein kleiner Beitrag von mir, der das Thema auch aufgreift: viewtopic.php?f=34&t=163763

Man muss aber auch verstehen, wie die Shell arbeitet und, dass in ihr alles nur Text und Textersetzung ist.
Use ed once in a while!

Benutzeravatar
Lohengrin
Beiträge: 3227
Registriert: 29.08.2004 00:01:05
Wohnort: Montsalvat

Re: awk printf syntax

Beitrag von Lohengrin » 19.11.2018 16:24:20

Huo hat geschrieben: ↑ zum Beitrag ↑
18.11.2018 14:55:19

Code: Alles auswählen

echo 101 202 303 | awk -F " " '{printf "+" $'$VAR' }'
Damit hast du mich kurzfristig verwirrt.
Es gibt nämlich bei Bash $'\n' und dergleichen. Und ich fragte mich, ob darin Variablen ausgepackt werden.
Nein, es ist anders. Das hat mit $'...' nichts zu tun. Hier wird '{printf "+" $' und dann $VAR und dann ' }' zusammengefügt.
Harry, hol schon mal das Rasiermesser!

Benutzeravatar
Lohengrin
Beiträge: 3227
Registriert: 29.08.2004 00:01:05
Wohnort: Montsalvat

Re: awk printf syntax

Beitrag von Lohengrin » 19.11.2018 17:37:08

speefak hat geschrieben: ↑ zum Beitrag ↑
18.11.2018 20:02:33
Gibt es da eine Möglichkeit das mal allgemeingültig in den Kopf zu bekommen.
man bash lesen.
Über den Daumen ist Folgendes.
Zwischen " wird $ aufgelöst. Zwischen ' nicht.
Bei Parametern hinter einem Befehl wird zusammengehalten, was zwischen " steht. $foo mit Leerzeichen drin und ohne " drumrum wird zu mehreren Parametern.
Bei Zuweisung foo=$bar wird alles im $bar zugewiesen, auch wenn Leerzeichen drin sind.
Bei Arrays hat @ statt * zur Folge, dass die Einzelteile wie mit " drumrum behandelt werden. Als Parameter hinter einem Befehl "${foo[@]}", "$foo[*]" oder ${foo[@]} ist, wenn Leerzeichen drin sind, unterschiedlich.

Drüber nachdenken, und man bash lesen! Steht alles drin.
Leider trampele ich gewöhnlich erst in eine Falle, lese dann nochmal bei man bash nach, und stelle dann fest, dass ich beim letzten Lesen nicht verstanden hatte, worum es geht, und dass genau das drin steht, was Bash tut.
Harry, hol schon mal das Rasiermesser!

Benutzeravatar
Lohengrin
Beiträge: 3227
Registriert: 29.08.2004 00:01:05
Wohnort: Montsalvat

Re: awk printf syntax

Beitrag von Lohengrin » 20.11.2018 02:53:24

Code: Alles auswählen

echo 101 202 303 | awk -F " " "{printf \"+\" \$$VAR }"
geht auch.
Diesmal steht der letzte Teil in ". Deshalb wird dort $VAR ausgepackt. Aber nun müssen die beiden " und das $ maskiert werden.
Harry, hol schon mal das Rasiermesser!

Benutzeravatar
speefak
Beiträge: 532
Registriert: 27.04.2008 13:54:20

Re: awk printf syntax

Beitrag von speefak » 20.11.2018 18:36:28

Ich glaub ich habs begriffen : mit den doppelquotes muss ich einfach nur alle Funktionszeichen escapen - das sieht grad nicht so wild aus wie die mischung aus " ' " ' " '" '

Benutzeravatar
Lohengrin
Beiträge: 3227
Registriert: 29.08.2004 00:01:05
Wohnort: Montsalvat

Re: awk printf syntax

Beitrag von Lohengrin » 20.11.2018 22:11:28

speefak hat geschrieben: ↑ zum Beitrag ↑
20.11.2018 18:36:28
mit den doppelquotes muss ich einfach nur alle Funktionszeichen escapen
Vermutlich meinst du "alle Funktioniszeichen, die nicht Funktionszeichen sein sollen".
Du musst ein " zwischen den " maskieren, weil das nicht das Schluss-" ist. Und du musst das linkeste $ maskieren, weil das ein $ werden soll, und nicht der Anfang von $$ ist, was augepackt würde, und dann die Prozessnummer ergäbe. Das $ vor dem VAR darfst du nicht maskieren.
Probiere das Ganze mit echo "{printf \"+\" \$$VAR }" aus und spiele damit herum!
speefak hat geschrieben: ↑ zum Beitrag ↑
20.11.2018 18:36:28
das sieht grad nicht so wild aus wie die mischung aus " ' " ' " '" '
Das sieht nur so wild aus, weil zwischen dem Schluss-' des linken Teils und dem mittleren Teil, und zwischen dem mittleren Teil und dem Anfangs-' des rechten Teils kein Leerzeichen und kein Tabulator stehen darf, weil das sonst mehrere Parameter würden.
Du kannst aber \ am Zeilenende setzen. Das \ mit Linefeed wird gefressen, so dass das genauso wie nichts ist.

Code: Alles auswählen

echo 101 202 303 | awk -F " " '{printf "+" $'\
"$VAR"\
' }'
geht auch. Es darf aber nicht eingerückt sein, denn Tabulator oder Leerzeichen vor dem mittleren oder dem rechten Teil würden wieder mehrere Parameter ergeben.
Harry, hol schon mal das Rasiermesser!

Antworten