externí proměnná v awk [duplicate]

Tato otázka již má odpovědi zde :

Odpověď

Proměnná prostředí je právě tato: a shell proměnná . Chcete-li ji proměnit na proměnnou awk , potřebujete syntaxi, například:

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

nebo

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

Ti však trpí problémem: jsou v nich rozšířeny únikové sekvence (a s GNU awk 4.2 nebo vyšší, pokud $x začíná @/ a končí /, je to považováno za typ proměnné regulárního výrazu ).

Takže například pokud proměnná prostředí obsahuje dva znaky zpětné lomítko a n , proměnná awk skončí obsahující znak nový řádek (a s gawk 4.2+, pokud obsahuje @/foo/, proměnná awk bude obsahovat foo a být typu regexp).

Jiný přístup (který však vyžaduje POSIX awk nebo nawk ( na rozdíl od původního awku, který se stále nachází v několika lichých Unices)), je použití proměnných prostředí:

Dalším přístupem (stále s novějšími awks) je použití pole ARGV v awk:

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

Komentáře

  • Pokud vím, ARGV je ve skutečnosti funkce POSIX, je to ' s právě definováno odlišně v gawk.
  • @ChrisDown Ano, ARGV a ENVIRON jsou POSIX, ale ne v původním awk, omlouvám se, pokud mi to nebylo ' jasné. Jak se liší v gawk?
  • gawk zahrnutí nerozpoznaných možností do ARGV, zatímco POSIX awk není ' t.
  • @ChrisDown, myslím, že ' odkazuje na případ, kdy je awk voláno s -f jako v awk -f script.awk arg1 arg2... kde GNU awk doesn ' není třeba -- označit konec možností, pokud arg1 začíná -, ale je není platná volba v konkrétní verzi awk. To ale ' pro tuto věc není relevantní, a rozhodně bych se na toto chování nespoléhal (přesto bych zahrnoval --).

Odpověď

V awk přímo, musíte je nejprve importovat jako awk proměnné.

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *