Разрешает ли grep поиск дубликатов?

#grep #duplicates #search

#grep #дубликаты #Поиск

Вопрос:

У меня много (около 100) больших csv-файлов с идентификатором sellID в первом столбце. Я знаю, что некоторые идентификаторы повторяются 2 или более раз в 2 или более файлах. Возможно ли с помощью grep найти все эти дубликаты sellID (create map sellID-file_name)? Или для этой цели существует другое приложение с открытым исходным кодом? Моя ОС — CentOS.

Комментарии:

1. не могли бы вы немного прояснить свой вопрос. Вам нужно найти все дубликаты определенных строк в нескольких файлах?

2. Дублируется ли вся запись, или некоторые строки имеют один и тот же идентификатор sellID, но остальная часть записи отличается?

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

Ответ №1:

Вот очень простой, несколько грубый awk скрипт для выполнения чего-то очень близкого к тому, что вы, кажется, описываете:

 #!/usr/bin/awk -f

{ if ($1 in seenbefore) {
    printf( "%st%sn", $1, seenbefore[$1]);
    printf( "%st%sn", $1, FILENAME);
    }
  seenbefore[$1]=FILENAME;
  }
  

Как вы, надеюсь, догадываетесь, все, что мы делаем, это создаем ассоциативный массив каждого значения, которое вы найдете в первом столбце / поле (задается FS в BEGIN специальном блоке для изменения разделителя полей ввода … для тривиально наивной формы поддержки CSV). Когда мы сталкиваемся с любым дубликатом, мы распечатываем дубликат, файл, в котором мы его ранее видели, и текущее имя файла. В любом случае мы затем добавляем / обновляем массив с именем текущего файла.

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

Для любого из этого я бы лично перешел на Python, где типы данных богаче (фактические списки и кортежи вместо того, чтобы объединять их в строки или встроенные и массив массивов), и у меня был бы доступ к гораздо большей мощности (фактический анализатор CSV, который может обрабатывать различные варианты цитируемого CSV и альтернативныеразделители, и где получение отсортированных результатов тривиально просто).

Однако, надеюсь, это поможет вам на правильном пути.

Ответ №2:

Связанный вопрос: https://serverfault.com/questions/66301/removing-duplicate-lines-from-file-with-grep

Вы могли бы объединить все файлы в один, а затем искать дубликаты, как предложено в ссылке выше.

Кстати, неясно, хотите ли вы сохранить только дубликаты или удалить их.

Ответ №3:

Еще один ответ:

Если ваш SellID имеет фиксированную длину (скажем, 6 символов), вы можете использовать

 sort data.txt | uniq -w 6 -D
  

При этом будут распечатаны строки, которые не являются уникальными

Если все, что вы хотите сделать, это автоматически удалять повторяющиеся строки (сохраняя первую), попробуйте:

 sort -u --key=1,1 data.txt
  

Ответ №4:

Попробуйте это:

 #Save duplicate columns
find path -type f -name '*.csv' -execdir cut -d, -f1 {}   | sort | uniq -d 
  > duplicate-ids.log
#List duplicate records
find path -type f -name '*.csv' -execdir grep -F -f duplicate-ids.log {}  
  

Примечание: я не тестировал его.