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 desfile
for 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 dividirdesfile
(ou a saída,desfile
se for um comando) em vários arquivos menores usandosplit
e, em seguida, iterar sobre eles. Em qualquer caso, você farianãoquero ligargrep
uma 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 grep
em vários casos.