Método grep mais eficiente

4

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.

    
por Jasper 23.10.2012 / 11:12

4 respostas

2

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
    
por 23.10.2012 / 11:15
2

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.
    
por 23.10.2012 / 17:24
1

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? ...

    
por 23.10.2012 / 17:07
-1

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ê é.

    
por 23.10.2012 / 13:24

Tags