Coloque todos esses números em um arquivo, cada um em sua própria linha, e use grep
com -f
ou --file=
switch:
grep -f filewithcodestosearchfor filetosearchin
Atualmente, estou usando dados de um arquivo contendo qualquer um dos itens a seguir:
342163477\|405760044\|149007683\|322391022\|77409125\|195978682\|358463993\|397650460\|171780277\|336063797\|397650502\|357636118\|168490006...............
Esta lista é mais longa e contém ~ 700 valores diferentes.
Qual é a maneira mais eficiente de extraí-lo? Eu posso cortar em partes de 10/20/50/100 ... Ou existem outros métodos unix? Este grep é canalizado para python para uma análise mais aprofundada, que é rápida o suficiente.
Coloque todos esses números em um arquivo, cada um em sua própria linha, e use grep
com -f
ou --file=
switch:
grep -f filewithcodestosearchfor filetosearchin
Você já tentou usar o --mmap
flag?
Do homem:
--mmap If possible, use the mmap(2) system call to read input, instead of the default read(2) system call. In some situations, --mmap yields better performance. However, --mmap can cause undefined behavior (including core dumps) if an input file shrinks while grep is operating, or if an I/O error occurs.
Não há necessidade de colocá-los em um arquivo, você pode fazer:
grep -F '342163477
405760044
149007683
322391022
77409125
195978682
358463993
397650460
171780277
336063797
397650502
357636118
168490006' file
também, que é tão portátil / padrão (como usar grep -Ff
, \|
em grep
BREs é não padrão / portátil).
Além disso, qual é a verdadeira questão? Você deseja obter as linhas que contêm esses números ou saber quais desses números aparecem no arquivo? O arquivo está classificado? Existe um número por linha no arquivo? ...
Como poige menciona em um comentário para outra resposta, use grep -F
/ fgrep
se você puder. Isso trata todos os caracteres regex como literais. Você ainda pode obter o efeito da alternação combinando isso com a opção -f file
e colocando seus padrões no arquivo, um padrão em uma linha.
Se você precisar que seus padrões incluam regex, tente limitar-se à sintaxe ERE clássica e use grep -E
/ egrep
. A sintaxe ERE clássica não inclui referências anteriores, portanto, nenhum padrão do formulário ...(pat)......
. Potencialmente, isso pode usar um DFA para realizar a correspondência e ser mais eficiente. Mas isso depende da sua implementação egrep. Mais discussão sobre isso é aqui . Note que algumas implementações do egrep, como as do Gnu, aceitam padrões com backreferences; mas ao combinar esses padrões, a vantagem de eficiência mencionada aqui certamente não estará presente.
Eu menciono a otimização egrep
para o interesse teórico, e porque valeria a pena testar para ver se isso ajuda no uso pretendido. Eu acho que, como diz o manatwork, o motor grep do Gnu é melhor para descobrir como otimizar o que você é.
Tags grep