Tenho um arquivo (search.patterns) com uma lista de padrões a serem pesquisados em uma lista de outros arquivos txt.
padrões de pesquisa
home
dog
cat
arquivo 1.txt
home 3
tiger 4
lion 1
arquivo 2.txt
dolphin 6
jaguar 3
dog 1
arquivo 3.txt
donkey 3
cat 4
horse 1
então eu quero que a primeira linha do arquivo padrão seja pesquisada no arquivo1, a segunda linha pesquisada no arquivo2 e a terceira linha no arquivo3
Resultado:
home 3
dog 1
cat 4
Eu escrevi um código assim:
for f in *.txt;
do
while IFS= read -r LINE;
do grep -f "$LINE" "$f" > "$f.out"
done < search.patterns
done
No entanto, os arquivos de saída estão vazios
Qualquer ajuda, muito apreciada, obrigado
Com GNU awk (
gawk
) você pode usar umaBEGINFILE
regra para ler um novo padrão toda vez que o arquivo de entrada for alterado:Você realmente deve verificar se
getline
retorna um novo padrão, por exemploObserve que
awk
os padrões são expressões regulares estendidas , semelhantes às suportadas pelagrep
opção-E
.Você pode conseguir o mesmo em não-GNU
awk
passandosearch.patterns
como o primeiro arquivo e usandoNR
eFNR
apropriadamente para ler os padrões em um array indexado ou procurar o próximo padrão no array.Usando
bash
:Testando:
O script salva os nomes de arquivo relevantes na
files
matriz e prossegue para ler os padrões dosearch.patterns
arquivo. Para cada padrão, o primeiro arquivo dafiles
lista é consultado. O arquivo processado é então excluído dafiles
lista (produzindo um novo primeiro nome de arquivo na lista).Se o número de padrões exceder o número de arquivos em
files
, haverá erros degrep
.Você pode usar
paste
para combinar o padrão com o arquivo:Estou assumindo que os nomes dos arquivos não contêm guias.