Enquanto você poderia fazer:
awk "/$p/" file2.txt > "$p.csv"
Isso tem o shell expandir o conteúdo da variável $p
shell no código passado para awk
, isso é uma prática ruim e basicamente equivale a uma vulnerabilidade de injeção de comando (por exemplo, para um valor de $p
como ^/{system("reboot");/
). O melhor é passar a variável do shell como é awk e usar o operador ~
do awk para correspondência de expressões regulares. A melhor maneira é através de uma variável de ambiente e awk
' ENVIRON
array especial:
export P
while IFS= read -r P; do
awk 'NR == 1 || $0 ~ ENVIRON["P"]' < file2.txt > "$P.csv"
done < file1.txt
Mas aqui, você pode evitar o loop do shell e fazer apenas uma passagem nos arquivos:
awk 'NR == FNR {files[$0]; next}
FNR == 1 {for (f in files) print > f ".csv"; next}
{
for (f in files)
if ($0 ~ f) print > f ".csv"
}' file1.txt file2.txt