Wie kann ich eindeutige Zeilen anhand einer Teilzeichenfolge filtern?

422
jhamburg

Wenn ich eine Reihe von URLs in einer Datei habe:

http://example.com/do?foo=bar&etc=123

http://example.com/do?etc=456&foo=bar

Ich möchte dies herausfiltern, sodass für jeden eindeutigen Wert des Parameters 'foo' nur eine URL vorhanden ist. Der Rest der URL ist egal, das einzig Wichtige ist, dass ich nicht zwei oder mehr Zeilen mit dem gleichen Wert von 'foo' habe.

-1
Was hast du versucht? Wo hast du versagt? Dies ist keine Website zum Schreiben von Skripts. Wir beraten nur die Benutzer, wie sie Fehler korrigieren können. MariusMatutiae vor 8 Jahren 1

1 Antwort auf die Frage

0
Gombai Sándor

Da Sie die Frage mit awk getaggt haben, kennen Sie sie wahrscheinlich auf einer bestimmten Ebene. Sie wissen zum Beispiel, dass Sie das Feldtrennzeichen in der Befehlszeile (und anderswo) auf eine Reihe von Zeichen setzen können, z. B. -F '[? & ] ' .

Möglicherweise wissen Sie auch, dass die NF- Variable die Anzahl der Felder enthält, die im aktuellen Eingabesatz (Zeile) analysiert werden, und Sie können eine Schleife zwischen 2 und NF mit einem C-Stil für (...; ...; ... ), um das Feld foo = xxx zu finden .

Und das Beste, was Sie hier tun können, ist das assoziative Array von awk (in anderen Kontexten als Dictionary oder Hash oder Map bezeichnet), in dem Sie einen Wert im Index speichern und prüfen können, ob ein Wert bereits als Index und im Array enthalten ist Entscheidungen entsprechend treffen. Sowie:

if ( ! (value in myarray) ) { print thelinevalueisfrom myarray[value] = 1 # just to register we have seen value for later usage } 

Im Grunde ist dies alles, was Sie hier brauchen.