Poiché non è possibile ottenere la trasformazione sotto la domanda in una corsa del comando :sort
, considerarla come una procedura in due passaggi.
Il primo passaggio consiste nell'ordinamento delle righe in base ai valori della seconda colonna separata da virgola. Per fare ciò, possiamo usare il comando :sort
che passa un'espressione regolare che corrisponde alla prima colonna e alla seguente virgola di separazione. Come :sort
confronta il testo che inizia subito dopo la corrispondenza del modello specificato su ciascuna riga, ci fornisce l'ordine di ordinamento desiderato.
:sort/^[^,]*,/
Per confrontare i valori numericamente, non lessicograficamente, utilizzare il flag n
:
:sort n/^[^,]*,/
La seconda fase prevede che attraversa le linee filtrate e rimuovendo tutti tranne uno tra quelli con la stessa valore nella seconda colonna. È comodo per costruire la nostra implementazione sul comando :global
che esegue un comando Ex su linee che corrispondono a un determinato modello. Per definizione, una riga può essere eliminata se contiene lo stesso valore nella seconda colonna come nella riga successiva. Questa formalizzazione (accompagnato con l'ipotesi iniziale che le virgole non possono verificarsi in valori di colonna) ci dà il seguente schema:
^[^,]*,\([^,]*\),.*\n[^,]*,\1,.*
Quindi, se corriamo il comando :delete
su ogni riga che soddisfa questo schema, da cima a in basso, avremo una sola riga per ogni valore distinto nella seconda colonna .
:g/^[^,]*,\([^,]*\),.*\n[^,]*,\1,.*/d_
Entrambe le fasi possono essere combinati in un unico comando Ex,
:sort/^[^,]*,/|g/^[^,]*,\([^,]*\),.*\n[^,]*,\1,.*/d_
Perché questo deve essere fatto in 'vim'? Devo pensare che usare un vero parser CSV per fare il lavoro sarebbe più facile. (A meno che tu non sia sicuro che i tuoi input non avranno "," incorporati in valori con virgolette o escape in stile backslash ...) – sarnold
Non * deve * essere fatto in vim; Ti sto chiedendo come lo faresti vim. Posso pensare a molti altri modi per farlo ... ma sto cercando una soluzione vim. – Jonah