Variáveis do shell não se tornam automaticamente awk de variáveis (também em awk , variáveis são expressas como var , não $var , que é o campo var th ). Se você quiser passar a variável shell para awk , uma abordagem simples é usar o ambiente:
#! /bin/sh -
file=$1
ST=$2
INC=$3
export ST INC
awk '
{
sep = ""
for (i = ENVIRON["ST"]; i <= NF; i += ENVIRON["INC"]) {
printf "%c%s", sep, $i
sep = OFS
}
printf "\n"
}' < "$file"
Lembre-se de citar suas variáveis de shell e que awk não pode obter nomes de arquivos arbitrários como argumento (pois trata alguns com = ou um chamado - especialmente).
Uma alternativa para passar variáveis para awk é usar -v awkvar="$shellvar" ou awkvar="$shellvar" argumentos após o script awk, mas eles não podem ser usados para strings arbitrárias, pois sequências de escape são expandidas nelas ( \ se torna \ e \n se torna uma nova linha por exemplo).
awk -v st="$st" -v inc="$inc" '{for (i = st; i <= NF; i += inc)...}' < "$file"
ou
awk '{for (i = st; i <= NF; i += inc)...}' st="$st" inc="$inc" < "$file"
seria OK aqui, já que essas variáveis servem apenas para conter números (portanto, nenhuma barra invertida).
Não importa o que você faça,
awk 'for (i = '"$st"'; i <= NF; i += '"$inc"')...'
e muito menos
awk 'for (i = '$st'; i <= NF; i += '$inc')...'
que tem o shell expande os valores das variáveis $st e $inc no código passado para awk , pois isso cria vulnerabilidades de injeção de comando (por exemplo, para valores de st like system("reboot") ) .