grep seletivamente

grep seletivamente

Eu tenho um arquivo com mais de 1000 designadores que eu uso no bash

for desig in $(desfile)
do
  grep $desig in listfile
done

listfile pode ter mais de 1 milhão de linhas, então a velocidade é importante

O problema é para designadores como

PA0EHH
DL/PA0EHH

que PA0EHHé encontrado duas vezes

Descobri que o awk poderia ser mais seletivo, mas é dolorosamente lento.

Responder1

grep -xF -f desfile listfile

Ou, se desfilefor um comando,

grep -xF -f <(desfile) listfile

ou,

desfile | grep -xF -f /dev/stdin listfile

As opções usadas aqui são

  • -x, requer uma correspondência em todo o comprimento da linha a. Isto é o que você deseja usar para não corresponder substrings nas linhas.
  • -F, usa comparações de strings em vez de correspondência de expressões regulares. Isso irá acelerar a consulta e será necessário se seus padrões contiverem caracteres especiais em expressões regulares (sem que você queira que eles sejam especiais).
  • -f filename, leia os padrões de um arquivo em vez de strings na linha de comando. Isso funcionará para uma quantidade moderada de padrões. Se você tem muitosmuitospadrões, você pode ficar sem memória; nesse caso, você pode querer dividir desfile(ou a saída, desfilese for um comando) em vários arquivos menores usando splite, em seguida, iterar sobre eles. Em qualquer caso, você farianãoquero ligar grepuma vez para cada padrão!

Responder2

Se você estiver verificando se o seu designador está no início de cada linha, você pode

grep ^$desig listfile

Se você quiser limitá-lo ao primeiro hit, adicione switch -m 1.
Se você precisar de uma pesquisa mais detalhada, tente regex:

testval=2
seq 40 | grep -e ^$testval\\b
seq 40 | grep -e \\b$testval\\b

ambos correspondem exatamente a 2, dependendo do seu caso de uso. E para evitar que o grep reconheça, por exemplo2/2

echo "2/2 2" | grep -e [^\/]\\b$testval\\b

cores na minha festa apenas o solitário 2.

Responder3

Como o desempenho é uma preocupação, considere usar o ripgrep, que faz benchmarks mais rapidamente do que grepem vários casos.

informação relacionada