Удалить дубликаты из CSV (т.е. удалить оригинал и дубликат) - PullRequest
0 голосов
/ 13 марта 2019

Сценарий: у меня есть два CSV-файла. Один CSV - это файл доверенных адресов (trusted.csv), другой csv тестирует файл адресов (testing.csv), в котором будут дубликаты адресов из первого файла.

Проблема: trust.csv уже использовался для печати этикеток. Мне нужно использовать testing.csv, чтобы создать больше меток, но у меня не может быть дубликатов. Я попытался объединить два CSV-файла, но я не могу понять, как удалить как дублирующую запись, так и исходную запись. Другая проблема заключается в том, что мне нужно игнорировать регистр. sort -uf работает так, как должен, но, конечно, это означает, что он оставляет исходное значение.

1 Ответ

0 голосов
/ 13 марта 2019

Поскольку вы говорите о sort, я думаю, что решение, основанное на командной строке, в порядке.

Это довольно сложное решение: я считаю, что есть что-то лучшее, но на данный момент у меня нет лучшей идеи,

Вам нужны строки, которые не соответствуют другим линиям (или удалите те, которые соответствуют).grep -v делает это очень хорошо, и если добавлена ​​опция -i, это не заботится о случае.Поскольку у вас может быть много повторяющихся строк для удаления, -f будет вашим другом, так как он позволяет указывать множество шаблонов в файле.Столько команд * nix и опций файла, которые задают - (одну черту) в качестве имени файла, заставляют команду читать данные из стандартного ввода, а не из файла в хранилище.Подводя итог: grep -i -f - -v ~/tmp/file будет читать файл /tmp/file и шаблоны из стандартного ввода.Он сохранит все строки, которые не соответствуют шаблонам, и сопоставление будет выполнено независимо от регистра символов.

Теперь вам нужно создать список шаблонов, представляющий собой список повторяющихся строк.uniq идентифицирует дубликаты соседних строк, -d заставляет печатать дубликаты один раз, а -i игнорирует регистр.чтобы сделать линию смежной, вы можете использовать sort, который с опцией -f также игнорирует регистр.Таким образом, sort -f ~/tmp/file | uniq -d -i получить файл печатает дубликаты один раз.

Соединение обеих частей приводит к следующей команде: sort -f ~/tmp/file | uniq -d -i | grep -i -f - -v ~/tmp/file.sort группирует одни и те же строки, так что uniq может содержать дубликаты, которые используются в качестве шаблонов для выбора строк, которые будут удалены.

Давайте рассмотрим пример.Файл ниже имеет одну букву в строке (dup просто идентифицирует дублирующиеся строки):

  a              dup
  b
  c              dup
  a              dup
  d
  C              dup
  e
  f
  c              dup
  A              dup

Применение нашей трубы фильтров приводит к:

sort -f ~/tmp/file   |   uniq -d -i   |   grep -i -f - -v ~/tmp/file
         a
         a
         A                                         b
         b                    a                    d
         c        ----->      b     ---->          e
         c                                         f
         C
         d
         e
         f
...