Tenho esse código que funciona muito bem para o que eu quero (de uma resposta para Imprimir valores duplicados do arquivo CSV, incluindo contagem de ocorrências, por @AdminBee e obrigado, a propósito!):
awk -F'|' '{c[$27]++} END{for (i in c) {if (c[i]>1) print c[i],i}}' input.csv
Preciso colocar isso em um arquivo separado (por exemplo, pk_check.awk
) e então poder chamá-lo de dentro de um zsh, mas passando variáveis como, por exemplo, separador, número_da_coluna, nome_do_arquivo e extensão, algo como
separator=|
column_number=27
filename=input
extension=csv
echo | awk -v x=$separator -v y=$column_number -v w=$filename -v z=$extension -f pk_check.awk
(o código acima é mais que uma ideia e pode estar incorreto ou ineficiente)
A ideia por trás disso é que eu poderia ter (no futuro) mais "mini-testes" awk genéricos o suficiente para serem chamados de um script zsh com parâmetros diferentes e talvez até mesmo esse script de shell pudesse receber ou processar uma lista de parâmetros para arquivos diferentes.
Mas antes de tudo isso, preciso resolver isso primeiro! :) Tentei algumas coisas feias demais para postar aqui e realmente não entendi muito bem como modificar o arquivo .awk para ser genérico ou como chamá-lo a partir de um script de shell.
Se o objetivo for apenas generalizar o script e dar a ele uma interface genérica/limpa, eu pessoalmente envolveria uma função Zsh em torno do script em vez de mexer nele para fazê-lo aceitar parâmetros comuns como
separator
,filename
eextension
até-v
; a exceção écolumn_number
, que teria que ser passado-v
de qualquer maneira:Uso:
Por exemplo:
Você poderia inventar um método para fazer a função "aceitar pares chave/valor", como
key=value
, mas ainda aproveitando parâmetros posicionais (e matrizes associativas); este é um método muito rudimentar e ingênuo para passar parâmetros nomeados para uma função, e tenho certeza de que ele quebraria em casos não triviais , sem mencionar que provavelmente seria um exagero para um wrapper. Estou apenas postando para fins de integridade:Uso:
Por exemplo: