Behalten Sie die erste Zeile bei, die mit einer Zeichenfolgen-Suche übereinstimmt, und entfernen Sie alle folgenden Zeilen, für die dieselbe Zeichenfolge gefunden wurde

361
mike

Ich versuche, die erste Zeile, die mit einer Zeichenfolgen-Suche übereinstimmt, beizubehalten und alle folgenden Zeilen zu entfernen, für die dieselbe Zeichenfolge gefunden wurde.

Irgendwelche Ideen?

$ cat example-input.txt Question one|some other text Question two|dfgdfgdfgvd Question one| dfg dfg dfg dfg Question three|aa bb cc dd eee Question one|zz aa BB yy qq Question four|zz xx yy qq  cat example-input.txt | someuniqprogramoroptions "Question one" > example-output.txt  $ cat example-output.txt Question one|some other text Question two|dfgdfgdfgvd Question three|aa bb cc dd eee Question four|zz xx yy qq $ 

UPDATE: Danke für den A-Code G-Man, du bist der Mann!

$ cat example-input.txt | ./awk-firstlines-only.sh Question one|some other text Question two|dfgdfgdfgvd Question three|aa bb cc dd eee Question four|zz xx yy qq 
0
Willkommen bei SU, Mike! Können Sie bitte zeigen, was Sie versuchen (Code), wir können Ihre Gedanken nicht lesen! duDE vor 7 Jahren 1
$ cat example-input.txt Frage eins | etwas anderer Text Frage zwei | dfgdfgdfgvd Frage eins | dfg dfg dfg dfg Frage drei | aa bb cc dd eee Frage eins | zz aa BB yy qq Frage vier | zz xx yy qq katze example-input.txt | someuniqueprogramand> example-output.txt $ cat example-output.txt Frage eins | etwas anderer Text Frage zwei | dfgdfgdfgvd Frage drei | aa bb cc dd eee Frage vier | zz xx yy qq $ mike vor 7 Jahren 0
Bitte antworten Sie nicht in Kommentaren oder indem Sie "Antworten" posten, die keine Antworten sind. Bearbeiten Sie Ihre Frage, um sie klarer und vollständiger zu machen. Geben Sie eine möglichst genaue Erklärung an. Scott vor 7 Jahren 0
Danke, Entschuldigung, dies ist meine erste Frage hier und ich versuche immer noch herauszufinden, wie man sie benutzt - nochmals vielen Dank mike vor 7 Jahren 0

3 Antworten auf die Frage

2
G-Man

Basierend auf dem von Ihnen angegebenen Beispiel wird dieser awkBefehl die gewünschte Ausgabe erzeugen:

awk ' { i = index($0, "|") if (i == 0) { print "Error: line [" $0 "] does not have a \"|\" character." } else { prefix = substr($0, 1, i-1) if (++count[prefix] == 1) print } }' 

Die ersten beiden Codezeilen vergewissern sich, dass jede Eingabezeile a enthält |. Im nächsten Schritt wird die Zeichenfolge vor dem ersten |Zeichen extrahiert (z. B. „Frage eins“).  countist ein assoziatives Array, mit dem gezählt wird, wie oft ein Präfix erscheint. Wenn dies # 1 ist (dh der erste Auftritt), drucken Sie die Zeile aus. Andernfalls nichts drucken.

Oder lassen Sie die Standardeinstellungen die meiste Arbeit erledigen: `awk -F '|' '! count [$ 1] ++' ` dave_thompson_085 vor 7 Jahren 0
0
Joce

Wenn der erste Teil eine feste Länge hat, ist der Befehl in uniqKombination mit sort:

cat example-input.txt | sort | uniq -W 13 

Dies ist für Ihr Beispiel nicht sehr angemessen, da Sie eine variable Länge haben und Ihre Datei neu angeordnet wird. Dies kann jedoch bei ähnlichen Jobs nützlich sein, wenn Sie kein Skript schreiben möchten.

0
Kjetil S.
perl -nle' /Question one/ and ($count++ or print) or print' example-input.txt 

... am Eingang des OPs-Beispiels wird seine Ausgabe erzeugt.

Ich glaube, OP hat mehr oder weniger das genaue Gegenteil davon gefordert. music2myear vor 7 Jahren 0
In der Frage wurde nicht angegeben, was mit einer nicht übereinstimmenden Zeile zu tun ist. Jedoch sein Beispiel mit Eingabe und Ausgabe. Kjetil S. vor 7 Jahren 0