Eu quero imprimir o nome do arquivo / s junto com o padrão correspondente, mas apenas uma vez, mesmo que a correspondência do padrão tenha várias ocorrências no arquivo.
Por exemplo Eu tenho uma lista de padrões; list_of_patterns.txt
e o diretório que eu preciso encontrar os arquivos é /path/to/files/*
.
list_of_patterns.txt :
A
B
C
D
E
/ path / to / files /
/file1
/file2
/file3
Digamos que /file1
tenha o padrão A
várias vezes como este:
/ file1 :
A
4234234
A
435435435
353535
A
(O mesmo vale para outros arquivos em que há várias correspondências de padrões).
Eu tenho este comando grep em execução, mas ele imprime o nome do arquivo toda vez que um padrão corresponde.
grep -Hof list_of_patterns.txt /path/to/files/*
saída:
/file1:A
/file1:A
/file1:A
/file2:B
/file2:B
/file3:C
/file3:B
... and so on.
Eu sei que o sort pode fazer isso quando você o canaliza após o comando grep -Hof list_of_patterns.txt /path/to/files/* | sort -u
do grep, mas ele só é executado quando o grep é finalizado. No mundo real, meu list_of_patterns.txt
tem centenas de padrões dentro dele. Demora algumas vezes uma hora para terminar a tarefa.
Existe uma maneira melhor de acelerar o processo?
UPDATE: alguns arquivos têm mais de cem ocorrências de padrão de correspondência. Por exemplo. /file4
tem ocorrências do padrão A
900 vezes. É por isso que está levando grep
uma hora para terminar porque imprime todas as ocorrências da correspondência de padrões junto com o nome do arquivo.
Por exemplo saída:
/file4:A
/file4:A
/file4:A
/file4:A
/file4:A
/file4:A
/file4:A
/file4:A
... and so on til' it reach 900 occurrences.
Eu só quero imprimir uma vez.
Por exemplo Saída desejada:
/file4:A
/file1:A
/file2:B
/file3:A
/file4:B