Rimuovere voci duplicate da un file CSV


13

Ho un file [csv] con un dato duplicato ristampato, cioè gli stessi dati stampati due volte. Ho provato con uniq di sorta da parte sort myfile.csv | uniq -ututtavia non v'è alcun cambiamento nella myfile.csv, anche ho provato sudo sort myfile.csv | uniq -uma nessuna differenza.

Quindi attualmente il mio file CSV è simile al seguente

a
a
a
b
b
c
c
c
c
c

Vorrei assomigliarlo

a
b
c

ordina -u myfile.csv> tmp.csv; mv -f tmp.csv myfile.csv
Archemar

secondo man sort, non è possibile ordinare "sul posto".
Archemar,

Puoi anche provare a non fare affidamento sul terminale. Puoi provare questo strumento online invece textmechanic.com/text-tools/basic-text-tools/…
Aminah Nuraini,

Risposte:


16

La ragione per la myfile.csvnon cambia è perché l' -uopzione per l' uniqavrà solo stampare linee uniche. In questo file, tutte le righe sono duplicate, quindi non verranno stampate.

Tuttavia, cosa ancora più importante, l'output non verrà salvato myfile.csvperché uniqverrà semplicemente stampato su stdout(per impostazione predefinita, la console).

Dovresti fare qualcosa del genere:

$ sort -u myfile.csv -o myfile.csv

Le opzioni significano:

  • -u - mantenere solo linee uniche
  • -o - output su questo file anziché stdout

Si dovrebbe visualizzare man sortper ulteriori informazioni.


3

Come ha mostrato Belmin, l'ordinamento è fantastico. La sua risposta è la migliore per i dati non ordinati, ed è facile da ricordare e da usare.

Tuttavia, è anche volatile, in quanto cambia l'ordine dell'input. Se devi assolutamente far passare i dati nello stesso ordine ma rimuovendo i duplicati successivi, awk potrebbe essere migliore.

$ cat myfile.csv
c
a
c
b
b
a
c


$ awk '{if (!($0 in x)) {print $0; x[$0]=1} }' myfile.csv
c
a
b

Caso strano, ma di tanto in tanto viene fuori.

Inoltre, se i tuoi dati sono già ordinati quando stai cercando, puoi semplicemente eseguire uniq.

$ cat myfile.csv 
a
a
a
b
b
c
c
c
c
c


$ uniq myfile.csv 
a
b
c

Lo svantaggio di entrambi i miei suggerimenti è che è necessario utilizzare un file temporaneo e copiarlo nuovamente.


2

uniq -u stampa solo linee uniche. Il tuo input non ha righe univoche, quindi uniq -unon stampare nulla. Hai solo bisogno di sort:

sort -u myfile.csv

2

Se vuoi mantenere l'ordine del file (non ordinato) ma rimuovi comunque i duplicati puoi farlo

awk '!v[$1]++' /tmp/file

Per esempio

d
d
a
a
b
b
c
c
c
c
c

Verrà emesso

d
a
b
c

Potresti espandere la sintassi, per favore?
Sopalajo de Arrierez,

Posiziona la stringa in un hash. Se la stringa NON esiste nell'hash, stampa.
NinjaGaiden
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.