: Sortiere dich - aber nur in einer Spalte in einem CSV?

8

Ich suche nach einer spezifischeren Version des Befehls :sort u , die alle doppelten Zeilen aus einer Datei entfernt. Ich arbeite mit einem CSV, und ich möchte alle Zeilen entfernen, wo der zweite Spalteneintrag ein Duplikat hat. Ein Beispiel soll helfen zu verdeutlichen:

%Vor% Der Befehl

sort sollte Folgendes liefern:

%Vor%

Hinweis: die spezifischen Zeilen, die beibehalten werden, sind nicht wichtig, solange nach der Sortierung die Einträge der zweiten Spalte alle eindeutig sind

Welcher vim Befehl erzeugt die obige Ausgabe?

Danke!

    
Jonah 19.04.2012, 22:16
quelle

3 Antworten

10

Da es nicht möglich ist, die Transformation unter der Frage in zu erreichen ein Durchlauf des Befehls :sort , betrachten wir ihn als zweistufigen Prozess.

Der erste Schritt besteht darin, die Zeilen nach den Werten der zweiten durch Kommas getrennten Zeile zu sortieren Säule. Um dies zu tun, können wir den :sort -Befehl verwenden, indem wir einen regulären übergeben Ausdruck, der der ersten Spalte und dem folgenden trennenden Komma entspricht. Als :sort vergleicht den Text, der unmittelbar nach der Übereinstimmung des angegebenen beginnt Muster auf jeder Zeile, gibt uns die gewünschte Sortierreihenfolge.

%Vor%

Um die Werte numerisch und nicht lexikographisch zu vergleichen, verwenden Sie das n -Flag:

%Vor%

Im zweiten Schritt werden die sortierten Zeilen durchlaufen und alle entfernt sie aber einer unter denen mit dem gleichen Wert in der zweiten Spalte. Es ist praktisch, um unsere Implementierung auf den Befehl :global zu bauen Führt den Ex-Befehl für Linien aus, die einem bestimmten Muster entsprechen. Per Definition, Eine Zeile kann gelöscht werden, wenn sie in der zweiten Spalte den gleichen Wert enthält wie die nächste Zeile. Diese Formalisierung (begleitet von der ursprünglichen Annahme) dass Kommas in Spaltenwerten nicht auftreten können) gibt uns das folgende Muster:

%Vor%

Wenn wir also den Befehl :delete für jede Zeile ausführen, die diesem Muster entspricht, Von oben nach unten haben wir nur eine Zeile für jeden einzelnen Wert in der zweite Spalte.

%Vor%

Beide Schritte können in einem Ex-Befehl kombiniert werden,

%Vor%     
ib. 20.04.2012, 02:48
quelle
1
%Vor%

zuerst nach Spalte mit Index 1 sortieren. zweite Übereinstimmung mit einer beliebigen Zeile, deren Spaltenindex 1 mit dem Spaltenindex 1 der nächsten Zeile übereinstimmt und ihn löscht.

Spaltenindex ist die 1 in {1} . es wird dreimal wiederholt.

    
Tom Whittock 20.04.2012 10:54
quelle
0

mit der zweiten Spalte

%Vor%

mit der dritten Spalte

%Vor%

oder

%Vor%

Oder

%Vor%

oder Überspringe die ersten beiden Wörter in jeder Zeile und sortiere mit folgendem:

%Vor%

oder

nach der letzten Spalte sortieren

%Vor%

ODER VERWENDEN SIE EIN ANDERES PROGRAMM, wie MS OFFICE oder OPENOFFICE

    
solution fix 27.03.2013 13:14
quelle

Tags und Links