Видаліть повторювані записи з файлу CSV


13

У мене є файл [csv] з повторним друком дубліката даних, тобто однакові дані, надруковані двічі. Я намагався використовувати sort uniq , sort myfile.csv | uniq -uоднак зміни в myfile.csv, також я намагався, sudo sort myfile.csv | uniq -uале різниці немає.

Тому наразі мій файл csv виглядає приблизно так

a
a
a
b
b
c
c
c
c
c

Я хотів би виглядати так

a
b
c

сортувати -u myfile.csv> tmp.csv; mv -f tmp.csv myfile.csv
Архемар

згідно man sort, ви не можете сортувати "на місці".
Архемар

Ви також можете спробувати не покладатися на термінал. Ви можете спробувати цей онлайн-інструмент замість textmechanic.com/text-tools/basic-text-tools/…
Aminah Nuraini

Відповіді:


16

Причина цього myfile.csvне змінюється в тому, що -uопція для друку uniqбуде лише унікальні рядки. У цьому файлі всі рядки є дублікатами, тому вони не будуть надруковані.

Однак, що ще важливіше, вихід не буде збережений, myfile.csvоскільки uniqвін просто роздрукує його stdout(за замовчуванням, ваша консоль).

Вам потрібно буде зробити щось подібне:

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

Параметри означають:

  • -u - зберігайте лише унікальні лінії
  • -o - вихід у цей файл замість stdout

Ви повинні переглянути man sortдля отримання додаткової інформації.


3

Як показав Белмін, сортування чудове. Його відповідь найкраще стосується несортованих даних, і їх легко запам'ятати та використовувати.

Однак він також мінливий, оскільки змінює порядок введення. Якщо вам абсолютно потрібно, щоб дані проходили в тому ж порядку, але видалення пізніших дублікатів, awk може бути кращим.

$ 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

Дивний край край, але він час від часу з’являється.

Крім того, якщо ваші дані вже відсортовані, коли ви на них кладете, ви можете просто запустити uniq.

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


$ uniq myfile.csv 
a
b
c

Недолік обох моїх пропозицій полягає в тому, що вам потрібно використовувати тимчасовий файл і скопіювати його назад.


2

uniq -u друкує лише унікальні рядки. У вашому введенні немає унікальних рядків, тому uniq -uнічого не друкуйте. Вам потрібно лише sort:

sort -u myfile.csv

2

Якщо ви хочете підтримувати порядок файлу (не відсортований), але все-таки видалити дублікати, ви також можете це зробити

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

Наприклад

d
d
a
a
b
b
c
c
c
c
c

Це виведе

d
a
b
c

Чи можете ви розширити синтаксис?
Sopalajo de Arrierez

Помістіть рядок у хеш. Якщо рядок НЕ існує в хеші, друкуйте.
NinjaGaiden
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.