extern variabel i awk [duplikat]

<åt sidan class = "s-notice s-notice__info js-post-notice mb16" role = "status">

Denna fråga har redan svar här :

Svar

En skalvariabel är just det: en skal variabel . Om du vill förvandla den till en awk -variabel behöver du en syntax som:

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

eller

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

De lider emellertid av ett problem: escape-sekvenser utökas i dem (och med GNU awk 4.2 eller högre, om $x börjar med @/ och slutar med / behandlas den som en regexp-typ av variabel ).

Så, till exempel om skalvariabeln innehåller de två tecknen backslash och n kommer awk-variabeln att innehålla newline karaktär (och med gawk 4.2+, om den innehåller @/foo/, kommer awk-variabeln att innehålla foo och vara av typen regexp).

Ett annat tillvägagångssätt (men som kräver en POSIX-awk eller nawk ( i motsats till den ursprungliga awk som fortfarande finns på några udda enheter)) är att använda miljövariabler:

Ett annat tillvägagångssätt (fortfarande med nyare awks) är att använda ARGV-arrayen i awk:

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

Kommentarer

  • Såvitt jag vet är ARGV faktiskt en POSIX-funktion, den ' s precis definierat annorlunda i gawk.
  • @ChrisDown Ja, både ARGV och ENVIRON är POSIX men inte i originalfunktionen, förlåt om jag inte ' inte klarade det. Hur är det annorlunda i gawk?
  • gawk innehåller okända alternativ i ARGV, medan POSIX awk inte ' t.
  • @ChrisDown, jag tror att du ' hänvisar till fallet där awk anropas med -f som i awk -f script.awk arg1 arg2... där GNU awk inte ' t behöver en -- för att markera slutet på alternativen om arg1 börjar med en - inte ett giltigt alternativ i den specifika versionen av awk. Men att ' inte är relevant för denna fråga, och jag skulle definitivt inte förlita mig på det beteendet (jag skulle ändå inkludera --).

Svar

Du kan inte använda externa variabler i awk direkt måste du importera dem som awk variabler först.

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

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *