Wie kann ich verhindern, dass grep dieselbe Zeichenfolge mehrmals druckt?


14

Wenn ich eine Datei mit folgendem Inhalt grep:

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

... für das Wort Thesewird die Zeichenfolge These are wordsviermal gedruckt .

Wie kann ich verhindern, dass grep wiederkehrende Zeichenfolgen mehrmals druckt? Wie kann ich andernfalls die Ausgabe von grep manipulieren, um doppelte Zeilen zu entfernen?


Soll die Reihenfolge der Treffer in der Ausgabe beibehalten werden? Andernfalls funktioniert der Befehl John1024 posted.
Kos

Antworten:


21

Die Unix-Philosophie besteht darin, Werkzeuge zu haben, die eine Sache tun und sie gut machen. In diesem Fall grepist dies das Tool, das Text aus einer Datei auswählt. Um festzustellen, ob Duplikate vorhanden sind, sortiert man den Text. Um die Duplikate zu entfernen, benutzt man die -uOption zu sort. Somit:

grep These filename | sort -u

sorthat viele Möglichkeiten: siehe man sort. Wenn Sie Duplikate zählen möchten oder ein komplizierteres Schema haben, um zu bestimmen, was ein Duplikat ist oder nicht, leiten Sie die Sortierausgabe an uniq: grep These filename | sort | uniqund sehen Sie in manuniq` nach Optionen.


2

Verwenden Sie grepund einen zusätzlichen Schalter, wenn Sie nur eine einzelne Zeichenfolge suchen

grep -m1 'These' filename

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

oder mit awk ;)

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

IMHO ist die am besten geeignete Antwort die -m Flagge. Ich schlage vor, Sie setzen es an die Spitze Ihrer Antwort. Sehr gute Antwort!
Sergiy Kolodyazhnyy

3
Dies funktioniert nicht, wenn Sie einen regulären Ausdruck verwenden - er stoppt sofort nach dem ersten Spiel und stellt nicht sicher, dass Sie nur eines von jedem möglichen Spiel erhalten.
CSVAN
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.