Eindeutige Zeilen drucken


Antworten:


22

So drucken Sie für jede identische Zeile nur eine Zeile in beliebiger Reihenfolge:

sort -u

So drucken Sie nur die eindeutigen Zeilen in beliebiger Reihenfolge:

sort | uniq -u

So drucken Sie jede identische Zeile nur einmal in der Reihenfolge ihres ersten Auftretens: (Drucken Sie für jede Zeile die Zeile, wenn sie noch nicht gesehen wurde, und erhöhen Sie in jedem Fall den Zähler für gesehene Zeilen.)

awk '!seen[$0] {print}
     {++seen[$0]}'

So drucken Sie nur die eindeutigen Zeilen in der Reihenfolge ihres ersten Auftretens: (Zeichnen Sie jede Zeile in seenund auch in der Reihenfolge ihres ersten Auftretens auf lines; drucken Sie am Ende der Eingabe die Zeilen in der Reihenfolge ihres Auftretens, jedoch nur die angezeigten Zeilen Einmal)

awk '!seen[$0]++ {lines[i++]=$0}
     END {for (i in lines) if (seen[lines[i]]==1) print lines[i]}'

8
wie wäre es awk '!seen[$0]++ {print}'?
— Asoundmove

10
Oder noch kürzer awk '!seen[$0]++', da das {print}durch einen leeren Befehl impliziert wird.
— Quazgar

2

Einige (die meisten?) Versionen von sorthaben ein -uFlag, das den uniqTeil direkt erledigt . Abhängig von der Implementierung kann es jedoch zu Einschränkungen der Zeilenlänge kommen, die Sie jedoch bereits mit plain hatten sort|uniq.


1
Äh? sort -ugeht zumindest auf V7 zurück.
— Geekosaurier

Hum ... Ich dachte, ich erinnere mich, dass Solaris oder AIX das nicht hatten. Ich liege jedoch falsch, beide haben es.
— Mat

Solaris und AIX haben -ujedoch auch eine Zeilenlängenbeschränkung von 512 Zeichen. (Eigentlich glaube ich, dass Solaris 9 Sun es auf 5120 erhöht hat. GNU gewinnt jedoch immer noch.)
— Geekosaurier

@geekosaur: bist du sicher? Die Arbeit, die zur Aufhebung der 512-Byte-Beschränkung der sortierten Zeilenlänge geleistet wurde, wurde von JP Linderman, Bell System Technical, in "Theorie und Praxis bei der Konstruktion einer funktionierenden Sortierroutine" dokumentiert. Journal, 63, 1827 & ndash; 1843 (1984).
— Jonathan Leffler

0

Funktioniert Perl für Sie? Es kann die Zeilen in der ursprünglichen Reihenfolge beibehalten, auch wenn die Duplikate nicht benachbart sind. Sie können es auch in Python codieren oder awk.

while (<>) {
    print if $lines{$_}++ == 0;
}

Welches kann nur gekürzt werden

perl -ne 'print unless $lines{$_}++;'

Gegebene Eingabedatei:

abc
def
abc
ghi
abc
def
abc
ghi
jkl

Es ergibt die Ausgabe:

abc
def
ghi
jkl

Wo werden $ lines definiert?
— Gregg Leventhal

Ist es nicht. Da es kein use strict;oder gibt use warnings;(eigentlich ist es das strict, was hier am relevantesten ist), gibt es keine Beschwerde über die Verwendung, %linesbevor es definiert ist. Wenn mit Einschränkungen gearbeitet wird, muss my %lines;vor der Schleife eine Linie stehen . Beachten Sie auch, dass der Hash ist %lines; Ein Element des Hash wird mit der $lines{$_}Notation referenziert .
— Jonathan Leffler

Ich denke, die sortLösungen sind möglicherweise besser für große Datenmengen (das OP war besorgt über das "Speichern der gesamten Datei im Speicher"). sortführt eine Out-of-Core-Sortierung durch, wenn die Daten größer als der verfügbare Speicher sind.
— Kusalananda

0

Für den letzten Teil der Antwort unter: Drucken eindeutiger Zeilen durch @Gilles als Antwort auf diese Frage habe ich versucht, die Verwendung von zwei Hashes zu vermeiden.

Diese Lösung ist für folgende Zwecke vorgesehen: So drucken Sie nur die eindeutigen Zeilen in der Reihenfolge ihres ersten Auftretens:

awk '{counter[$0]++} END {for (line in counter) if (counter[line]==1) print line}'

Hier speichert "counter" eine Zählung jeder Zeile, die der zuvor verarbeiteten ähnlich ist.
Am Ende werden nur die Zeilen gedruckt, deren Zählerwert 1 ist.

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.