Удалить повторяющиеся записи из файла 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

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

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


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

Не могли бы вы расширить синтаксис?
Сопалахо де Арриерес

Поместите строку в хеш. Если строка не существует в хэше, выведите.
NinjaGaiden
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.