külső változó az awk-ban [duplicate]

Ennek a kérdésnek már megvannak a válaszai :

Válasz

A héjváltozó éppen ilyen: a shell változó . Ha azt szeretné, hogy awk változóvá váljon, akkor szüksége van egy szintaxisra, például:

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

vagy

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

Azok azonban problémát szenvednek: a menekülési szekvenciák kibővülnek bennük (és a GNU awk 4.2 vagy újabb verzióival ha $x @/ -vel kezdődik és /, a regexp változótípusként kezeljük ).

Tehát például, ha a shell változó a két karaktert visszavágó és tartalmazza n az awk változó végül az newline karaktert fogja tartalmazni (és a gawk 4.2+ verzióval, ha @/foo/ -t tartalmaz, akkor az awk változó tartalmazza a foo -t, és regexp típusú legyen.

Másik megközelítés (de ehhez POSIX awk vagy nawk szükséges ( ellentétben az eredeti awk-val, amely még mindig megtalálható néhány páratlan Unicel)) környezeti változók használata: 79110249a “>

Egy másik megközelítés (még mindig újabb awk-kkel) az ARGV tömb használata awk-ban:

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

Megjegyzések

  • Ha jól tudom, a ARGV valójában POSIX szolgáltatás, ' s csak másképp definiálva itt: gawk.
  • @ChrisDown Igen, mind a ARGV, mind a ENVIRON vannak POSIX-osok, de nincsenek az eredeti awk-ban, sajnálom, ha nem voltam ' tisztában ezzel. Miben különbözik a gawk fájlban?
  • gawk ismeretlen opciókat tartalmaz a ARGV, míg a POSIX awk nem ' t.
  • @ChrisDown, szerintem ' arra az esetre utal, amikor az awk-t -f -vel hívják, mint a awk -f script.awk arg1 arg2... -ben, ahol a GNU awk nem ' nem kell egy -- az opciók végének megjelöléséhez, ha az arg1 - -vel kezdődik nem érvényes beállítás a awk adott verziójában. De ez ' nem releváns ebben az ügyben, és én biztosan nem támaszkodnék erre a viselkedésre (ennek ellenére a -- -et is beletenném).

Válasz

Külső változókat nem használhat a awk közvetlenül, először awk változóként kell importálni őket.

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

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük