
Estou tentando corresponder o padrão para uma coluna específica nos milhares de arquivos compactados em uma máquina Linux e, com base na correspondência, quero imprimir o nome do arquivo como fazer isso. As opções abaixo não estão funcionando para mim, alguma sugestão, por favor. Obrigado
zgrep 12345 *| awk -F"^" '{if($8==12345) print}'
find . -type f |xargs zcat | awk -F"^" '{if($8==12345) print}'
Responder1
O IMHO mais claro/simples é:
while IFS= read -r fname; do
zcat "$fname" | awk -F'^' -v fname="$fname" '$8==12345{print fname, $0}'
done < <(find . -type f)
mas também há a opção de imprimir o nome do arquivo do zgrep e lê-lo com o awk, o que pode ser mais eficiente (mas depende do nome do arquivo não conter nenhum :
s):
zgrep -H '12345' * |
awk -F'^' '{fname=$0; sub(/:.*/,"",fname); sub(/[^:]+:/,"")} $8==12345{print fname, $0}'
Ambas as soluções assumem que você não tem novas linhas nos nomes dos arquivos e a primeira também não assume sequências de escape como \t
nos nomes dos arquivos.