Usando este exemplo:
#submission,date
"test1","22 April 2024"
"test2","24 April 2024"
"test3","25 March 2024"
"test6","01 April 2023"
"test7","02 April 2022"
"test8","03 April 2021"
Gostaria de imprimir apenas os testes do mês atual, que no momento da escrita é abril de 2024. Tentando este comando:
awk -F, -v date="$(date +'%B %Y')" '/^[^#]/ && $2 ~ /'$date'\"$/{print $1}' tests.csv
Imprime todos os testes. Como as variáveis Bash devem ser comparadas usando o Awk?
Em relação a
How are variables ...
- seja muito claro o que você quer dizer com "variáveis" em seu pensamento, código e perguntas. Você está chamando awk de um shell, bash. Bash não é estranho - são duas ferramentas completamente separadas, cada uma com sua própria sintaxe, semântica, escopos e variáveis .No seu código você tem:
que está preenchendo uma variável awk , não uma variável shell, com a saída da chamada para a outra ferramenta Unix
date
.Assim como no
C
, no awk você obtém o valor de uma variável apenas usando seu nome, ao contrário do shell onde você tem que colocar um$
na frente do nome da variável para obter seu valor, então na próxima parte do seu código:você usaria apenas
date
para obter o valor da variável awkdate
, MAS agora você tem um segundo problema - você está usando-o dentro de delimitadores regexp literais/.../
, mas precisa construir seu regexp a partir de uma variáveldate
mais, aparentemente, a string\"$
e então você precisa de um regexp dinâmico lá, não um regexp literal. Dado isso, essa parte do seu código deve ser:Dado isso, seu script seria:
Se fosse eu, faria a concatenação para formar o regexp uma vez ou onde
date
foi inicializado pela primeira vez:ou na
BEGIN
seção:portanto, isso não acontece uma vez por linha de entrada, pois a concatenação de strings é uma operação relativamente lenta.
Se você já quis usar o valor de uma variável shell dentro de um script awk, veja como faço para usar variáveis shell em um script awk para saber como fazer isso.