Behalten Sie die erste Zeile bei, die einer Zeichenfolgensuche entspricht, und entfernen Sie alle folgenden Zeilen, die dieselbe Zeichenfolge enthalten

0

Ich versuche, die erste Zeile, die einer Zeichenfolgensuche entspricht, beizubehalten und alle folgenden Zeilen zu entfernen, in denen dieselbe Zeichenfolge übereinstimmt.

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 awk 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
Mike
quelle
1
Willkommen in SU, Mike! Können Sie bitte zeigen, was Sie versuchen (Code), wir können Ihre Gedanken nicht lesen!
duDE
$ cat example-input.txt Frage eins | ein anderer Text Frage zwei | dfgdfgdfgvd Frage eins | dfg dfg dfg dfg Frage drei | aa bb cc dd eee Frage eins | zz aa BB jj qq Frage vier | zz xx jj qq cat example-input.txt | someuniqueprogramand> example-output.txt $ cat example-output.txt Frage eins | irgendein anderer Text Frage zwei | dfgdfgdfgvd Frage drei | aa bb cc dd eee Frage vier | zz xx yy qq $
mike
Bitte antworten Sie nicht in Kommentaren oder mit "Antworten", die keine Antworten sind. Bearbeiten Sie Ihre Frage, um sie klarer und vollständiger zu gestalten. Geben Sie so genau wie möglich eine Erklärung.
Scott
danke, sorry das ist mein erster frage posten hier und ich versuche immer noch herauszufinden, wie ich es verwenden soll - danke nochmal
mike

Antworten:

2

Basierend auf dem Beispiel, das Sie angegeben haben, erzeugt dieser awkBefehl die Ausgabe, nach der Sie fragen:

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 stellen sicher, dass jede Eingabezeile a enthält |. Der nächste extrahiert die Zeichenfolge vor dem ersten |Zeichen (z. B. „Frage eins“).  countist ein assoziatives Array, mit dem wir zählen, wie oft jedes Präfix vorkommt. Wenn dies die Nummer 1 ist (dh das erste Erscheinungsbild), drucken Sie die Zeile aus. Andernfalls drucken Sie nichts.

G-Man
quelle
Oder lassen Sie die awk -F'|' '!count[$1]++'
Standardeinstellungen den
0

Wenn der erste Teil eine feste Länge hat, ist eine alternative Lichtlösung der Befehl uniqkombiniert mit sort:

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

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

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

... am Eingang von OPs erzeugt das Beispiel seine Ausgabe.

Kjetil S.
quelle
Ich glaube, OP hat mehr oder weniger das genaue Gegenteil davon gefordert.
music2myear
In der Frage wurde nicht angegeben, was mit nicht übereinstimmenden Zeilen geschehen soll. Aber sein Beispiel mit Input und Output.
Kjetil S.