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.