2016-12-27 4 views
1

Я работаю в SEO, и иногда мне приходится управлять списками доменов, которые необходимо учитывать для определенных действий в наших кампаниях. На моем iMac у меня есть 2 списка, один предоставлен для рассмотрения - unfiltered.txt - и еще один, который перечислил домены, которые я уже проанализировал - used.txt. Один предусмотрено рассмотрение, новый (unfiltered.txt), выглядит следующим образом:Решение для Mac OS-терминала для удаления из строк текстового файла из другого текстового файла

site1.com 
site2.com 
domain3.net 
british.co.uk 
england.org.uk 
auckland.co.nz 
... etc 

Список доменов, которые необходимо использовать в качестве фильтра, чтобы устранить (used.txt) - выглядит следующим образом.

site4.org 
site5.me 
site6.co.nz 
gland.org.uk 
kland.co.nz 
site7.de 
site8.it 
... etc 

Есть ли способ, чтобы использовать мой X терминал OS, чтобы удалить из unfiltered.txt всех линий, найденных в used.txt? Найденное программное решение, которое частично решает проблему, и, кроме слов из used.txt, исключает также слова, содержащие эти меньшие слова. Это означает, что я получаю более широкий фильтр и устраняю также домены, которые мне по-прежнему нужны.

Например, если мой файл unfiltered.txt содержит домен с именем fogland.org.uk, он будет автоматически удален, если в моем файле used.txt у меня есть домен с именем gland.org.uk.

Файлы довольно большие (около 100 тыс. Строк). У меня довольно хорошая конфигурация: SSD, 7-й генератор 7-го поколения, 16-гигабайтная оперативная память, но маловероятно, чтобы она работала в течение нескольких часов только для этой операции.

... надеемся, что это имеет смысл.

ТИА

+0

Дубликат [Удалить строки из файла, которые появляются в другом файле] (http://stackoverflow.com/questions/4366533/remove-lines-from-file-which-appear-in-another-file) – davidcondrey

ответ

0

Вы можете использовать comm. У меня нет mac здесь, чтобы проверить, но я ожидаю, что он будет установлен по умолчанию. Обратите внимание, что оба файла должны быть отсортированы. Тогда попробуйте:

comm -2 -3 unfiltered.txt used.txt

Проверьте страницу человека для получения дополнительной информации.

+0

Работает с grep , но он не обрабатывает большие файлы. Найдено grep -Fvx -f used.txt unfiltered.txt> final.txt && mv final.txt unfiltered.txt. Я предполагаю, что comm не поможет ни при работе с 100k строк в каждом файле. Что означает «сортировка»? – designarti

+0

Я ожидаю, что 'comm' будет намного быстрее, чем' grep' в этой задаче. Я только что проверил, используя 2 файла со 100-килограммовыми линиями, а 'comm' занял около 0,2 с на моем ноутбуке при первом запуске. Я пробовал с 'grep', но он не закончил через минуту, поэтому я его убил. – user133831

+0

«сортировка» означает упорядочить по порядку. Существуют разные системы упорядочения, но в этом случае, которые вы используете, не имеет значения, если оба файла используют один и тот же. Общий порядок сортировки «алфавитный». См. Https://en.wikipedia.org/wiki/Sorting – user133831

1

Вы можете сделать это с помощью awk. Вы передаете оба файла в awk. При анализе первого файла, где текущий номер записи во всех файлах совпадает с номером записи в текущем файле, вы отмечаете каждый зарегистрированный вами домен. Затем, при разборе второго файла, вы только распечатать записи, которые соответствуют те, которые вы не видели в первом файле:

awk 'FNR==NR{seen[$0]++;next} !seen[$0]' used.txt unfiltered.txt 

Пример вывода для ввода данных

site1.com 
site2.com 
domain3.net 
british.co.uk 
england.org.uk 
auckland.co.nz 

awk включена и поставляется как часть macOS - нет необходимости устанавливать что-либо.

+0

спасибо, но это быстрее, чем grep для больших файлов? – designarti

+0

В вашем вопросе не упоминалось, что скорость была проблемой, и я не знаю, насколько велики ваши файлы, и насколько быстро ваш диск - попробуйте просто попробовать. –

+0

Хорошо. Ваше решение предоставляется на нескольких других страницах в stackoverflow. Основная проблема, о которой все говорят, когда дело касается awk, - это скорость. Пробовал это несколько дней назад, это самое простое решение, но об этом. Скорость - фактор, размер файла - еще один фактор. Я добавлю скорость и размер файла в спецификации. Еще раз спасибо. – designarti

0

Я всегда использовал

grep -v -F -f expunge.txt filewith.txt > filewithout.txt 

, чтобы сделать это. Когда «вычеркнуть»..txt»слишком велик, вы можете сделать это в несколько этапов, разрезая его на управляемые куски и фильтрации один за другим:

cp filewith.txt original.txt 

and loop as required: 
    grep -v -F -f chunkNNN.txt filewith.txt > filewithout.txt 
    mv filewithout.txt filewith.txt 

Вы даже могли бы сделать это в трубе:

grep -v -F -f chunk01.txt original.txt |\ 
grep -v -F -f chunk02.txt original.txt |\ 
grep -v -F -f chunk03.txt original.txt \ 
> purged.txt 
0

Вы можете использовать comm и замена процесса сделать все в одной строке:

comm -23 <(sort used.txt) <(sort unfiltered.txt) > used_new.txt 

PS протестирована на моем Mac работает OSX 10.11.6 (El Capitan)

Смежные вопросы