ekstern variabel i awk [duplikat] (Norsk)

Dette spørsmålet har allerede svar her :

Svar

En skallvariabel er akkurat det: en skall variabel . Hvis du vil gjøre den om til en awk variabel, trenger du en syntaks som:

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

eller

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

De lider imidlertid av et problem: escape-sekvenser utvides i dem (og med GNU awk 4.2 eller høyere, hvis $x starter med @/ og slutter med / behandles den som en regexp-type variabel ).

Så for eksempel hvis skallvariabelen inneholder de to tegnene tilbakeslag og n vil awk-variabelen ende opp med newline -tegnet (og med gawk 4.2+, hvis den inneholder @/foo/, vil awk-variabelen inneholder foo og være av typen regexp).

En annen tilnærming (men som krever en POSIX-awk eller nawk ( i motsetning til den opprinnelige awk som fremdeles finnes på noen merkelige enheter)) er å bruke miljøvariabler:

En annen tilnærming (fortsatt med nyere awks) er å bruke ARGV-arrayet i awk:

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

Kommentarer

  • Så vidt jeg vet er ARGV faktisk en POSIX-funksjon, den ' s bare definert annerledes i gawk.
  • @ChrisDown Ja, både ARGV og ENVIRON er POSIX, men ikke i originalen, beklager hvis jeg ikke var ' ikke klar over det. Hvordan er det annerledes i gawk?
  • gawk inkluderer ukjente valg i ARGV, mens POSIX awk ikke ' t.
  • @ChrisDown, jeg tror du ' refererer til tilfellet der awk kalles med -f som i awk -f script.awk arg1 arg2... der GNU awk ikke ' t trenger en -- for å markere slutten på alternativene hvis arg1 starter med en - ikke et gyldig alternativ i den bestemte versjonen av awk. Men at ' ikke er relevant for denne saken, og jeg vil definitivt ikke stole på den oppførselen (jeg vil inkludere -- likevel).

Svar

Du kan ikke bruke eksterne variabler i awk direkte, må du importere dem som awk variabler først.

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *