¿Cómo evitar que grep imprima la misma cadena varias veces?


14

Si grep un archivo que contiene lo siguiente:

These are words
These are words
These are words
These are words

... para la palabra These, imprimirá la cadena These are wordscuatro veces.

¿Cómo puedo evitar que grep imprima cadenas recurrentes más de una vez? De lo contrario, ¿cómo puedo manipular la salida de grep para eliminar líneas duplicadas?


¿Debería mantenerse el orden de los partidos en la salida? De lo contrario, el comando publicado John1024 funcionará.
kos

Respuestas:


21

La filosofía de Unix es tener herramientas que hagan una cosa y las hagan bien. En este caso, grepes la herramienta que selecciona texto de un archivo. Para saber si hay duplicados, uno clasifica el texto. Para eliminar los duplicados, uno usa la -uopción para sort. Así:

grep These filename | sort -u

sorttiene muchas opciones: ver man sort. Si desea contar duplicados o tiene un esquema más complicado para determinar qué es o no es un duplicado, canalice la salida de clasificación a uniq: grep These filename | sort | uniqy vea manuniq` para ver las opciones.


2

Uso grepy un interruptor adicional, si está buscando una sola cadena

grep -m1 'These' filename

Desde man grep

-m NUM, --max-count=NUM
        Stop reading a file after NUM matching lines.  If the input is
        standard input from a regular file, and NUM matching lines are
        output, grep ensures that the standard input is positioned  to
        just  after  the  last matching  line  before exiting, regardless
        of the presence of trailing context lines.  This enables a calling
        process to resume a search.  When grep stops after NUM matching
        lines, it outputs any trailing context lines.  When the -c or
        --count option is also used, grep does not output a count greater
        than NUM.  When the -v or --invert-match option is also used, grep
        stops after outputting NUM non-matching lines.

o usando awk ;)

awk '/These/ {print; exit}' foo

En mi humilde opinión, la respuesta más apropiada es la bandera -m. Le sugiero que lo ponga en la parte superior de su respuesta. Muy buena respuesta!
Sergiy Kolodyazhnyy

3
Esto no funcionará si está utilizando una expresión regular: se detendrá inmediatamente después de la primera coincidencia, no se asegurará de obtener una y solo una de cada coincidencia posible.
csvan
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.