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 .