Позволяет ли grep искать дубликаты? - PullRequest
3 голосов
/ 05 октября 2011

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

Ответы [ 4 ]

1 голос
/ 05 октября 2011

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

#!/usr/bin/awk -f

{ if ($1 in seenbefore) {
    printf( "%s\t%s\n", $1, seenbefore[$1]);
    printf( "%s\t%s\n", $1, FILENAME);
    }
  seenbefore[$1]=FILENAME;
  }

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

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

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

Тем не менее, это, мы надеемся, поможет вам встать на правильный путь.

1 голос
/ 05 октября 2011

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

#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 {} \+

Примечание: я не проверял.

1 голос
/ 05 октября 2011

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

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

sort data.txt | uniq -w 6 -D

Это выведет строки, которые не являются уникальными

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

sort -u --key=1,1 data.txt
1 голос
/ 05 октября 2011

Похожие вопросы: https://serverfault.com/questions/66301/removing-duplicate-lines-from-file-with-grep

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...