Ich habe meine Referenzen als Textdatei mit einer langen Liste von Einträgen und jedem hat zwei (oder mehr) Felder.
Die erste Spalte ist die URL der Referenz. Die zweite Spalte ist der Titel, der je nach Eingabe leicht variieren kann. Gleiches gilt für das dritte Feld, das vorhanden sein kann oder nicht.
Ich möchte Einträge identifizieren, aber nicht entfernen, bei denen das erste Feld (Referenz-URL) identisch ist. Ich weiß davon, sort -k1,1 -u
aber das wird automatisch (nicht interaktiv) alle außer dem ersten Treffer entfernen. Gibt es eine Möglichkeit, mich einfach zu informieren, damit ich auswählen kann, welche ich behalten möchte?
Im folgenden Auszug aus drei Zeilen mit demselben ersten Feld ( http://unix.stackexchange.com/questions/49569/
) möchte ich Zeile 2 beibehalten, da sie zusätzliche Tags (Sortieren, CLI) enthält und die Zeilen 1 und 3 löscht:
http://unix.stackexchange.com/questions/49569/ unique-lines-based-on-the-first-field
http://unix.stackexchange.com/questions/49569/ Unique lines based on the first field sort, CLI
http://unix.stackexchange.com/questions/49569/ Unique lines based on the first field
Gibt es ein Programm zur Identifizierung solcher "Duplikate"? Dann kann ich manuell bereinigen, indem ich die Zeilen 1 und 3 persönlich lösche.
quelle
Antworten:
Wenn ich Ihre Frage verstehe, denke ich, dass Sie etwas brauchen wie:
oder:
Wo
file.txt
ist Ihre Datei mit Daten über Sie interessiert.In der Ausgabe sehen Sie die Anzahl der Zeilen und Zeilen, in denen das erste Feld zweimal oder mehrmals gefunden wird.
quelle
cut -d " " -f1 file.txt | uniq -d
gibt mir sogar schöne Ergebnisse.Dies ist ein klassisches Problem, das mit dem
uniq
Befehl gelöst werden kann .uniq
kann doppelte aufeinanderfolgende Zeilen erkennen und Duplikate entfernen (-u
,--unique
) oder nur Duplikate behalten (-d
,--repeated
).Da die Reihenfolge doppelter Zeilen für Sie nicht wichtig ist, sollten Sie sie zuerst sortieren. Verwenden Sie dann
uniq
, um nur eindeutige Zeilen zu drucken:Es gibt auch eine
-c
(--count
) Option, die die Anzahl der Duplikate für die-d
Option druckt .uniq
Einzelheiten finden Sie auf der Handbuchseite von .Wenn Sie sich wirklich nicht für die Teile nach dem ersten Feld interessieren, können Sie den folgenden Befehl verwenden, um doppelte Schlüssel zu finden und jede Zeilennummer dafür zu drucken (fügen Sie eine andere hinzu
| sort -n
, damit die Ausgabe nach Zeilen sortiert wird):Da Sie doppelte Zeilen sehen möchten (indem Sie das erste Feld als Schlüssel verwenden), können Sie diese nicht direkt verwenden
uniq
. Das Problem, das die Automatisierung erschwert, besteht darin, dass die Titelteile variieren, ein Programm jedoch nicht automatisch bestimmen kann, welcher Titel als endgültiger Titel betrachtet werden soll.Hier ist ein AWK-Skript (speichern in
script.awk
), das Ihre Textdatei als Eingabe verwendet und alle doppelten Zeilen druckt, damit Sie entscheiden können, welche gelöscht werden sollen. (awk -f script.awk yourfile.txt
)quelle
-w
(--check-chars
) Option, um auf eine feste Anzahl von Zeichen zu beschränken, aber in Ihrem Beispiel haben Sie variable erste Felder. Da dieuniq
Feldauswahl nicht unterstützt wird, müssen Sie eine Problemumgehung verwenden. Ich werde ein AWK-Beispiel hinzufügen, da dies einfacher ist.-w
aber die Länge des ersten Feldes ist variabel :(Wenn ich das richtig lese, brauchen Sie nur so etwas
Dadurch wird die Nummer der Zeile ausgedruckt, die den Betrüger enthält, und die Zeile selbst. Beispiel: Verwenden dieser Datei:
Es wird diese Ausgabe erzeugen:
Sie können nur die Nummer der Zeile drucken
Und um nur die Zeile zu drucken:
Erläuterung:
Das
awk
Skript druckt nur das erste durch Leerzeichen getrennte Feld der Datei. Verwenden Sie$N
diese Option, um das N-te Feld zu drucken.sort
sortiert es unduniq -c
zählt die Vorkommen jeder Zeile.Dies wird dann an die
while
Schleife übergeben, die die Anzahl der Vorkommen als$num
und die Zeile speichert,$dupe
wenn und wenn sie$num
größer als eins ist (also mindestens einmal dupliziert wird), durchsucht sie die Datei nach dieser Zeile unter Verwendung von-n
druckt die Zeilennummer. Das--
sagt,grep
dass das Folgende keine Befehlszeilenoption ist, die nützlich ist, wenn Sie$dupe
damit beginnen können-
.quelle
Zweifellos könnte die ausführlichste in der Liste kürzer sein:
gibt auf eine Textdatei wie:
eine Ausgabe wie:
Sobald Sie die zu entfernenden Zeilen ausgewählt haben:
quelle
Siehe folgende sortiert
file.txt
:Da die Liste kurz ist, kann ich (nach dem Sortieren) sehen, dass es drei Sätze von Duplikaten gibt.
Dann kann ich zum Beispiel wählen:
eher, als
Für eine längere Liste wird dies jedoch schwierig sein. Basierend auf den beiden Antworten, die eine vorschlagen
uniq
und die andere vorschlagencut
, stelle ich fest, dass dieser Befehl mir die Ausgabe gibt, die ich möchte:quelle
cut
. Wenn Sie Deduplizierungsarbeiten ausführen, können Zeilennummern sehr hilfreich sein. Verwenden Sie zum Drucken aller Duplikate die-D
Option anstelle von-d
.for dup in $(cut -d " " -f1 file.txt | uniq -d); do grep -n $dup file.txt; done
wie in meiner Antwort. Sie erhalten eine bessere Vorschau auf das, was Sie interessiert.So habe ich es gelöst:
file_with_duplicates:
Datei sortiert und dedupiert nach Spalten 1 und 2:
Datei nur nach Spalten 1 und 2 sortiert:
Zeigen Sie nur den Unterschied:
quelle