Como imprimir apenas 1 nome de arquivo junto com o padrão correspondente?

1

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
    
por WashichawbachaW 14.02.2018 / 07:28

1 resposta

3

Is there a better way to speedup the process?

Sim, é chamado de GNU parallel :

parallel -j0 -k "grep -Hof list_of_patterns.txt {} | sort -u" ::: /path/to/files/*
  • j N - número de jobslots. Execute até N jobs em paralelo. 0 significa o maior número possível.
  • k ( --keep-order ) - mantém sequência de saída igual à ordem de entrada
  • ::: arguments - use arguments da linha de comando como fonte de entrada em vez de stdin (entrada padrão)
por 14.02.2018 / 08:21