Seu problema imediato é os espaços ao redor do sinal de igual. O argumento para a opção -v
deve ser uma atribuição. O Awk vê um argumento para -v
, seguido por um script ( =
), seguido por nomes de arquivos (o valor de TOKEN
, seu script e seus nomes de arquivos).
Você fez um erro semelhante no script de shell mais acima: week = $1
deve ser week="$1"
.
A propósito, sempre coloque aspas duplas em torno das substituições de comandos . Por exemplo, se TOKEN
for *
, ela será substituída pela lista de arquivos no diretório atual.
awk -v "group=$TOKEN"
Isso não define group
como o valor de TOKEN
, porque o awk trata o lado direito da atribuição como um literal na sintaxe do awk. Por exemplo, se o valor de TOKEN
for a string de 7 caracteres foo\bar
, a variável awk group
será definida como a string de 6 caracteres foo␈ar
, em que ␈
é um caractere de retrocesso (valor de byte 8 ).
A maneira direta de passar uma variável para um script awk é exportá-lo para o ambiente e usá-lo via array ENVIRON
.
Além disso, você não está usando a variável group
em qualquer parte do script awk. O regexp /group/
corresponde a qualquer string contendo a string de 5 caracteres group
. Se você quiser verificar se o campo é exatamente o valor de group
(para que, por exemplo, se o valor de TOKEN
for GROUP2
, um campo contendo GROUP24
não será correspondido), use o operador de igualdade ==
.
export TOKEN
awk -F "," '{ if (FNR > 2 && $2 == ENVIRON["TOKEN"]){print $0} }' infile >> outfile_$week
Aqui está o script inteiro, simplificado um pouco mais para usar a sintaxe de ação-condição do awk (onde a ação é omitida aqui, pois print $0
é o padrão) e para evitar abrir o arquivo de saída toda vez:
#!/bin/sh
week="$1"
shift
for TOKEN in "$@"
do
echo "adding records for" $TOKEN
awk -F "," 'FNR > 2 && $2 == ENVIRON["TOKEN"]' infile
done >"outfile_$week"
Veja a resposta de Stéphane Chazelas para uma maneira mais avançada de usar o awk que não requer o processamento do arquivo de entrada várias vezes .