Vielleicht möchten Sie sich die uniq
und sort
Anwendungen ansehen .
./IhrSkript.ksh | sortieren | uniq
(FYI, ja, die Sortierung ist in dieser Befehlszeile erforderlich, entfernt uniq
nur doppelte Zeilen, die unmittelbar nacheinander liegen)
BEARBEITEN:
Im Gegensatz zu dem, was Aaron Digulla in Bezug auf uniq
die Befehlszeilenoptionen gepostet hat :
Angesichts der folgenden Eingabe:
Klasse
Krug
Krug
Krug
Behälter
Behälter
Java
uniq
gibt alle Zeilen genau einmal aus:
Klasse
Krug
Behälter
Java
uniq -d
gibt alle Zeilen aus, die mehr als einmal erscheinen, und druckt sie einmal:
Krug
Behälter
uniq -u
gibt alle Zeilen aus, die genau einmal angezeigt werden, und druckt sie einmal aus:
Klasse
Java
sort
bietet eine-u
Version, mit der auch die eindeutigen Werte angegeben werden können.uniq
Nähte nur benachbarte Linien verarbeiten (zumindest standardmäßig), was bedeutet, dass man siesort
vor dem Zuführen eingeben kannuniq
.Dies entspricht der Antwort von Monoxid , ist jedoch etwas prägnanter.
quelle
... | sort | uniq
weil es in einem Schuss ausgeführt wirdFür größere Datenmengen, bei denen eine Sortierung möglicherweise nicht wünschenswert ist, können Sie auch das folgende Perl-Skript verwenden:
Dies speichert im Grunde nur jede Zeilenausgabe, so dass sie nicht erneut ausgegeben wird.
Es hat den Vorteil gegenüber der "
sort | uniq
" Lösung, dass im Voraus keine Sortierung erforderlich ist.quelle
Mit zsh können Sie dies tun:
Oder Sie können AWK verwenden:
quelle
awk
Lösung ( eine Erklärung finden Sie unter stackoverflow.com/a/21200722/45375 ) funktioniert mit großen Dateien, solange die Anzahl der eindeutigen Zeilen klein genug ist (da eindeutige Zeilen im Speicher bleiben) ). Diezsh
Lösung liest zuerst die gesamte Datei in den Speicher, was bei großen Dateien möglicherweise nicht möglich ist. Außerdem werden, wie geschrieben, nur Zeilen ohne eingebettete Leerzeichen korrekt behandelt. Um dies zu beheben, verwenden SieIFS=$'\n' read -d '' -r -A u <file; print -l ${(u)u}
stattdessen.(IFS=$'\n' u=($(<infile)); print -l "${(u)u[@]}")
[@]
Suffix benötigen, um auf alle Elemente eines Arrays zu verweisen. Es scheint, dass es - zumindest ab Version 5 - ohne dieses Suffix funktioniert. oder hast du es nur aus Gründen der Klarheit hinzugefügt?print -l "${(fu)$(<infile)}"
awk
Beispielausgabe zu korrigieren.Pipe sie durch
sort
unduniq
. Dadurch werden alle Duplikate entfernt.uniq -d
gibt nur die Duplikate,uniq -u
gibt nur die eindeutigen (Streifen Duplikate).quelle
uniq -u
ist NICHT das Standardverhalten (siehe die Bearbeitung in meiner Antwort für Details)Mit AWK können Sie es tun, ich finde es schneller als sortieren
quelle
Einzigartig, wie gewünscht (aber nicht sortiert);
verwendet weniger Systemressourcen für weniger als ~ 70 Elemente (wie mit der Zeit getestet);
geschrieben, um Eingaben von stdin zu übernehmen
(oder zu ändern und in ein anderes Skript aufzunehmen):
(Bash)
quelle
Ich bekomme bessere Tipps, um nicht doppelte Einträge in einer Datei zu erhalten
quelle