#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 {}
Примечание: я не тестировал его.