GNU/Linux >> Linux Esercitazione >  >> Linux

Elimina le righe consecutive in Csv con valori duplicati in un campo, ma mantieni l'ultima riga?

Ho un lungo file CSV con due colonne, che include esecuzioni di duplicati consecutivi come questo:

...
1500,1533
1554,1678
1554,1703
1554,1728
1593,1766
...

Devo eliminare tutti questi duplicati tranne l'ultimo, quindi l'output per l'esempio sopra sarebbe:

...
1500,1533
1554,1728
1593,1766
...

Inoltre ho bisogno di mantenere il resto delle righe nel file nel loro ordine originale.

Ho provato tac file.csv | sort -k1,1 -r -u -t,

ma questo non ha dato il risultato desiderato e le funzioni basate sull'ordinamento hanno incasinato il mio ordine di riga.

Risposta accettata:

Con sed :

sed '$!N;/\(.*,\).*\n\1/!P;D' infile

N significa che ci sono sempre due righe consecutive nello spazio del modello e sed P riscrive il primo solo se il primo campo di quella riga non è uguale al primo campo della seconda riga. Quindi D rimuove la prima riga dallo spazio del modello e riavvia il ciclo.

Un altro modo con gnu datamash (supponendo che il tuo file sia ordinato come datamash richiede un input ordinato):

datamash -t ',' -g 1 last 2 <infile

Questo g raggruppa il , input delimitato da 1 st campo, stampando solo l'last valore (da 2 nd colonna) di ciascun gruppo.

Se il tuo file non è ordinato datamash può ordinarlo tramite -s :

datamash -t ',' -s -g 1 last 2 <infile

ma ciò significa che l'ordine iniziale delle righe non verrà preservato. Quindi questo potrebbe non fare quello che vuoi. In tal caso potresti usare sed /awk /perl ecc...


Linux
  1. Copia e incolla nella riga di comando di Linux con xclip

  2. Scorrere i file con spazi nei nomi??

  3. Strumento per ottenere le righe in un file che non sono in un altro?

  4. Stampa l'ultima riga di un file, dalla CLI

  5. Ordinamento sull'ultimo campo di una riga

Ordinare ma mantenere la riga di intestazione in alto?

Trova l'età del file più vecchio in una riga o restituisci zero?

Duplicato, con poche piccole modifiche, poche righe in un file di testo?

Come stampare l'ultima riga di un file compresso gz nella riga di comando?

Linee grep che iniziano con 1, ma non 10, 11, 100 ecc

sostituire le righe in un file con le righe in un altro per numero di riga