Удалить повторяющиеся записи из файла CSV

13

У меня есть файл [csv] с перепечаткой дубликатов данных, т.е. одни и те же данные напечатаны дважды. Я попытался с помощью 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
3kstc
источник
sort -u myfile.csv> tmp.csv; mv -f tmp.csv myfile.csv
Archemar
согласно man sort, вы не можете сортировать «на месте».
Archemar
Вы также можете попытаться не полагаться на терминал. Вы можете попробовать этот онлайн-инструмент вместо textmechanic.com/text-tools/basic-text-tools/…
Амина Нураини,

Ответы:

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

Недостатком обоих моих предложений является то, что вам нужно использовать временный файл и скопировать его обратно.

Falsenames
источник
2

uniq -u печатает только уникальные строки. Ваш ввод не имеет уникальных строк, поэтому uniq -uничего не печатать. Вам нужно только sort:

sort -u myfile.csv
cuonglm
источник
2

Если вы хотите сохранить порядок файлов (не отсортирован), но по-прежнему удалять дубликаты, вы также можете сделать это

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

Например

d
d
a
a
b
b
c
c
c
c
c

Будет выводить

d
a
b
c
NinjaGaiden
источник
Не могли бы вы расширить синтаксис?
Сопалахо де Арриерес
Поместите строку в хеш. Если строка не существует в хэше, выведите.
NinjaGaiden