Desejo imprimir o(s) nome(s) do arquivo 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, tenho uma lista de padrões; list_of_patterns.txt
e o diretório que preciso para encontrar os arquivos é /path/to/files/*
.
list_of_patterns.txt :
A
B
C
D
E
/caminho/para/arquivos/
/file1
/file2
/file3
Digamos que /file1
tenha o padrão A
várias vezes assim:
/arquivo1 :
A
4234234
A
435435435
353535
A
(Também vale para outros arquivos onde há várias correspondências de padrão.)
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/*
resultado:
/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 grep -Hof list_of_patterns.txt /path/to/files/* | sort -u
, mas ele só é executado quando o grep é concluído. No mundo real, my list_of_patterns.txt
tem centenas de padrões dentro. Às vezes, leva uma hora para terminar a tarefa.
Existe uma maneira melhor de acelerar o processo?
ATUALIZAÇÃO: alguns arquivos têm mais de cem ocorrências de padrão correspondente. Ex /file4
. tem ocorrências do padrão A
900 vezes. É por isso que está demorando grep
uma hora para terminar porque imprime todas as ocorrências da correspondência de padrão 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 que imprima apenas uma vez.
Ex.: Saída desejada:
/file4:A
/file1:A
/file2:B
/file3:A
/file4:B
Sim, chama-se GNU
parallel
:j N
- número de postos de trabalho. ExecutarN
trabalhos em paralelo.0
significa o maior número possível.k
(--keep-order
) - mantém a sequência de saída igual à ordem de entrada::: arguments
- usearguments
a partir da linha de comando como fonte de entrada em vez de stdin (entrada padrão)