element
não é uma variável awk
.
Para importar o valor de uma variável shell para um script awk
, você pode usar
awk -v variable="$value" '{ script goes here }'
No exemplo acima, a variável chamada variable
obteria o valor da variável shell chamada value
. Você usaria variable
no script awk
sem prefixá-lo com $
.
Observe que, se você prefixar uma variável com $
em awk
, ela assumirá que o valor da variável é um inteiro positivo e se refere a um campo específico no registro de entrada atual. A expressão $element
forneceria, por exemplo, o valor do campo element
(assim como $1
fornece o valor do primeiro campo e $NF
fornece o valor do último campo, em que NF
é a variável interna que indica o número de campos no registro atual).
Se element
não estiver definido no código awk
, $element
será, portanto, expandido para $0
, que é a linha completa. Seu código imprimiria a linha inteira se seu primeiro campo delimitado por tabulação fosse a única coisa na linha.
Seu script awk
também pode ser reduzido para
awk -F '\t' -v e="$element" '$1 == e'
Ou você pode substituir a coisa toda por
arr_country=(AL AD AM AT BY BE BA BG CH)
( IFS='|'; grep -E "^(${arr_country[*]})\>" ) <abc.txt >xyz.txt
ou
grep -E '^(AL|AD|AM|AT|BY|BE|BA|BG|CH)\>' <abc.txt >xyz.txt
A substituição do parâmetro ${arr_country[*]}
será expandida para uma única string, consistindo nos valores da matriz, delimitados pelo primeiro caractere de $IFS
. Isso cria uma expressão regular idêntica à segunda grep
mostrada acima. \>
corresponderá ao espaço de largura zero no final de uma palavra (para que ^AA\>
corresponda a AA
no início de uma linha, mas não AAA
).
A única diferença é que o resultado pode ser ordenado diferentemente em comparação com a solução de loop de shell com awk
.
Uma abordagem diferente para eliminar o loop do shell (assumindo o valor padrão de $IFS
):
arr_country=(AL AD AM AT BY BE BA BG CH)
awk -v c="${arr_country[*]}" -F '\t' '
BEGIN { n=split(c,a," "); for (i=1;i<=n;++i) country[a[i]] }
$1 in country' <abc.txt >xyz.txt
Aqui, fornecemos os elementos de arr_country
como uma string delimitada por espaço ao código awk
na variável c
. Antes de começar a ler a entrada, a string c
é dividida em partes e cada parte é transformada em uma chave em uma matriz associativa country
. Se o primeiro campo for uma chave nessa matriz, a linha será impressa.