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...