Usuń zduplikowane wpisy z pliku CSV

13

Mam plik [csv] z powielonym duplikatem bazy danych, tj. Te same dane wydrukowane dwukrotnie. Próbowałem użyć sortq uniq , sort myfile.csv | uniq -uale nie ma zmian w myfile.csv, także próbowałem, sudo sort myfile.csv | uniq -uale nie ma różnicy.

Więc obecnie mój plik csv wygląda tak

a
a
a
b
b
c
c
c
c
c

Chciałbym tak wyglądać

a
b
c
3kstc
źródło
sort -u mój_plik.csv> tmp.csv; mv -f tmp.csv mój_plik.csv
Archemar
zgodnie z tym man sort, nie można sortować „na miejscu”.
Archemar,
Możesz także spróbować nie polegać na terminalu. Możesz wypróbować to narzędzie online zamiast textmechanic.com/text-tools/basic-text-tools/…
Aminah Nuraini

Odpowiedzi:

16

Powodem myfile.csvnie zmienia się tak, ponieważ -uopcja uniqbędzie tylko drukować unikatowych linii. W tym pliku wszystkie wiersze są duplikatami, więc nie zostaną wydrukowane.

Co ważniejsze, wyjście nie zostanie zapisane, myfile.csvponieważ uniqpo prostu wydrukuje je stdout(domyślnie na konsoli).

Musisz zrobić coś takiego:

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

Opcje oznaczają:

  • -u - zachowuj tylko unikalne linie
  • -o - wyjście do tego pliku zamiast stdout

Powinieneś zobaczyć, man sortaby uzyskać więcej informacji.

Belmin Fernandez
źródło
3

Jak pokazał Belmin, sortowanie jest świetne. Jego odpowiedź jest najlepsza w przypadku nieposortowanych danych i jest łatwa do zapamiętania i użycia.

Jest jednak również niestabilny, ponieważ zmienia kolejność danych wejściowych. Jeśli absolutnie potrzebujesz przechodzić dane w tej samej kolejności, ale usuwać późniejsze duplikaty, awk może być lepszy.

$ 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

Dziwny przypadek na krawędzi, ale pojawia się od czasu do czasu.

Ponadto, jeśli Twoje dane są już posortowane, gdy się na nie zaczepiasz, możesz po prostu uruchomić uniq.

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


$ uniq myfile.csv 
a
b
c

Wadą obu moich sugestii jest to, że musisz użyć pliku tymczasowego i skopiować go z powrotem.

Falsenames
źródło
2

uniq -u drukuje tylko unikalne linie. Twój wkład nie ma unikalnych wierszy, więc uniq -unie drukuj niczego. Potrzebujesz tylko sort:

sort -u myfile.csv
Cuonglm
źródło
2

Jeśli chcesz zachować porządek pliku (nieposortowany), ale nadal usuwać duplikaty, możesz to zrobić

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

Na przykład

d
d
a
a
b
b
c
c
c
c
c

Wyjdzie

d
a
b
c
NinjaGaiden
źródło
Czy możesz rozwinąć składnię?
Sopalajo de Arrierez
Umieść ciąg w haszu. Jeśli łańcuch NIE istnieje w haszu, to wydrukuj.
NinjaGaiden