Možný duplikát:
Použijte parametr skriptu v awk
Mám skript, ve kterém je úryvek skriptu
x=3
awk '$2=$x{print $1}' infile
externí proměnná je x,
ale zobrazí chybu v awk
jak tedy v této situaci zajistit, aby awk úspěšně běžel?
díky!
Přijatá odpověď:
Proměnná shellu je právě to:a shell proměnná . Chcete-li z něj udělat awk proměnnou, potřebujete syntaxi jako:
awk -v x="$x" '$2 == x {print $1}' infile
nebo
awk '$2 == x {print $1}' x="$x" infile
Ty však trpí problémem:escape sekvence jsou v nich rozšířeny (a pomocí GNU awk
4.2 nebo vyšší, pokud $x
začíná @/
a končí na /
, je považována za proměnnou typu regulárního výrazu).
Pokud tedy například proměnná shellu obsahuje dva znaky zpětné lomítko a n , proměnná awk bude obsahovat nový řádek znak (a s gawk 4.2+, pokud obsahuje @/foo/
, proměnná awk bude obsahovat foo
a musí být typu regexp
).
Dalším přístupem (který však vyžaduje POSIX awk nebo nawk (na rozdíl od původního awk, který se stále vyskytuje na několika lichých Unicích)) je použití proměnných prostředí:
x="$x" awk '$2 == ENVIRON["x"] {print $1}' infile
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