grep selectivamente

grep selectivamente

Tengo un archivo de más de 1000 designadores que desde bash uso

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

El archivo de lista puede tener más de 1 millón de líneas, por lo que la velocidad es importante.

El problema es para designadores como

PA0EHH
DL/PA0EHH

que PA0EHHse encuentra dos veces

Descubrí que awk podría ser más selectivo pero es tremendamente lento.

Respuesta1

grep -xF -f desfile listfile

O, si desfilees un comando,

grep -xF -f <(desfile) listfile

o,

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

Las opciones utilizadas aquí son

  • -x, requiere una coincidencia en toda la longitud de la línea a. Esto es lo que desea utilizar para no hacer coincidir subcadenas en las líneas.
  • -F, utiliza comparaciones de cadenas en lugar de coincidencias de expresiones regulares. Esto acelerará la consulta y sería necesario si sus patrones contienen caracteres que son especiales en expresiones regulares (sin que usted quiera que sean especiales).
  • -f filename, lea los patrones de un archivo en lugar de cadenas en la línea de comando. Esto funcionará para una cantidad moderada de patrones. si tienes muchosmuchospatrones, es posible que se quede sin memoria, en cuyo caso es posible que desee dividir desfile(o la salida desfilesi es un comando) en varios archivos más pequeños usando splity luego iterar sobre estos. En cualquier caso, lo haríasno¡Quiero llamar grepuna vez para cada patrón!

Respuesta2

Si está verificando que su designador esté al comienzo de cada fila, podría

grep ^$desig listfile

Si desea limitarlo al primer golpe, agregue el interruptor -m 1.
Si necesita una búsqueda más detallada, pruebe con expresiones regulares:

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

ambos coinciden exactamente con 2, dependiendo de su caso de uso. Y para evitar que grep reconozca, por ejemplo2/2

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

colores en mi fiesta solo los solitarios 2.

Respuesta3

Dado que el rendimiento es una preocupación, considere usar ripgrep, que realiza evaluaciones comparativas más rápido que grepen varios casos.

información relacionada