awk - lê o programa AND input da entrada padrão?

2

É possível que o awk leia o programa e a entrada do padrão entrada?

Gostaria de poder enviar um arquivo para a seguinte função.

process_data () {
  awk -f - <<EOF
{print}
EOF
}

Nota: o programa atual é mais longo, não pode ser passado como uma linha de comando argumento, e prefiro não usar arquivos temporários.

Atualmente, não produz nada.

$ yes | head | process_data 
$ 
    
por Ernest A 04.08.2014 / 16:41

2 respostas

7
process_data() {
  awk -F /dev/fd/3 3<< \EOF
  awk code here
EOF
}

Observe que os argumentos da linha de comando podem conter caracteres de nova linha e, embora haja um limite de tamanho, é geral em algumas centenas de kilobytes.

awk '
  BEGIN {...}
  /.../ ...
  END {...}
'

Se o problema for incorporar caracteres de aspas simples no script awk , outra abordagem é armazenar o código em uma variável:

awk_code=$(cat << \EOF
{print "'quoted' " $0}
EOF
)

E faça:

process_data() {
  awk "$awk_code"
}
    
por 04.08.2014 / 17:02
3

Por que você precisa obter o programa de stdin ? Você poderia usar aspas simples ( ' ), pois o Bash permite dividir o conteúdo entre várias linhas.

# awk 'BEGIN { sum = 0 }
{ sum += $1 }
END { printf("sum = %d\n", sum) }' << EOF
1
2
3
EOF
    
por 04.08.2014 / 16:49