externe Variable in awk [duplizieren]

Diese Frage hat hier bereits Antworten :

Antwort

Eine Shell-Variable ist genau das: eine Shell Variable . Wenn Sie daraus eine awk -Variable machen möchten, benötigen Sie eine Syntax wie:

awk -v x="$x" "$2 == x {print $1}" infile 

oder

awk "$2 == x {print $1}" x="$x" infile 

Diese leiden jedoch unter einem Problem: Escape-Sequenzen werden in ihnen erweitert (und mit GNU awk 4.2 oder höher, wenn $x mit @/ beginnt und mit / wird als regexp-Variablentyp behandelt ).

Wenn die Shell-Variable beispielsweise die beiden Zeichen backslash und enthält n enthält die awk-Variable am Ende das Zeichen newline (und bei gawk 4.2+, wenn sie @/foo/ enthält, enthält die awk-Variable Enthält foo und ist vom Typ regexp).

Ein anderer Ansatz (der jedoch ein POSIX awk oder nawk erfordert ( im Gegensatz zum ursprünglichen awk, wie es immer noch auf einigen ungeraden Unices zu finden ist)) werden Umgebungsvariablen verwendet:

Ein anderer Ansatz (immer noch mit neueren awks) besteht darin, das ARGV-Array in awk zu verwenden:

awk "BEGIN {x = ARGV[1]; delete ARGV[1]} $2 == x {print $1}" "$x" infile 

Kommentare

  • Soweit ich weiß, ist ARGV tatsächlich eine POSIX-Funktion, ' s nur in gawk anders definiert.
  • @ChrisDown Ja, sowohl ARGV als auch ENVIRON sind POSIX, aber nicht im Original-Awk. Tut mir leid, wenn ich ' darüber nicht klar war. Wie unterscheidet es sich in gawk?
  • gawk enthält nicht erkannte Optionen in ARGV, während POSIX awk nicht ' t.
  • @ChrisDown, ich denke, Sie ' bezieht sich auf den Fall, in dem awk mit -f aufgerufen wird, wie in awk -f script.awk arg1 arg2..., wo GNU awk nicht ' benötigt kein --, um das Ende der Optionen zu markieren, wenn arg1 mit einem - beginnt, dies aber ist Keine gültige Option in dieser bestimmten Version von awk. Aber das ' ist für diese Angelegenheit nicht relevant, und ich würde mich definitiv nicht auf dieses Verhalten verlassen (ich würde trotzdem das -- einschließen).

Antwort

In awk direkt müssen Sie sie zuerst als awk -Variablen importieren.

x=3 awk -v foo="$x" "$2=foo{print $1}" infile 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.