Печать строк из одного файла, если часть их появляется в другом. Оба файла являются миллионами строк долго

Ваше имя хоста должно не иметь никакого отношения к способности соединиться с Интернетом. Это - то, если сервер DHCP в Вашей сети не присваивает IP-адреса на основе имени хоста (который, если это делает, это - большая ошибка).

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

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

7
07.04.2016, 03:10
2 ответа

Можно сделать это очень легко использование grep:

$ grep -Ff 123.txt 789.txt
http://www.a.com/kgjdk-jgjg/ 
http://www.b.com/gsjahk123/ 
http://www.c.com/abc.txt 

Команда выше распечатает все строки из файла 789.txt это содержит любую из строк от 123.txt.-f означает, "читает шаблоны для поиска из этого файла", и-F говорит grep рассматривать шаблоны поиска как строки и не его регулярные выражения по умолчанию.

Это не будет работать если строки 123.txt содержите конечные пробелы, grep будет рассматривать пробелы как часть шаблона для поиска желания не, соответствуют, если это происходит в слове. Например, шаблон foo (отметьте конечный пробел), не будет соответствовать foobar. Для удаления конечных пробелов из файла выполните эту команду:

$ sed 's/ *$//' 123.txt > new_file

Затем используйте new_file к grep:

$ grep -Ff new_file 789.txt

Можно также сделать это без нового файла, с помощью i флаг:

$ sed -i.bak 's/ *$//' 123.txt

Это изменит файл 123.txt и сохраните копию оригинала названной 123.txt.bak.

(Обратите внимание что эта форма -i флаг к sed предполагает, что у Вас есть GNU sed; для BSD sed использовать -i .bak с промежуточным пространством.)

13
27.01.2020, 20:14
  • 1
    я не думаю первая опция, работал бы, независимо от случая OP: это распечатало бы строки в 123.txt это не находится в 789.txt а также строки в 789.txt это появляется в 123.txt (они будут только распечатаны однажды, но распечатаны, тем не менее). –  Joseph R. 01.08.2013, 19:35
  • 2
    @JosephR. Вы абсолютно правы, мое плохое. Я удалил то предложение. Спасибо за указание на него. –  terdon♦ 01.08.2013, 19:39
  • 3
    Привет там, спасибо очень много :) это почти работает, но существует две мелочи - это должно сохранять тех, которые соответствуют другому файлу, и частичное соответствие для жемчуга, кажется, не является довольно рабочим в тесте, который я запустил, это, кажется, потому что все мои строки не имеют никаких пробелов в них. Я сожалею о noobishness, мои навыки жемчуга не очень хороши. –  Joe 01.08.2013, 19:58
  • 4
    @Joe не проблема. Вы могли добавить некоторый вход в качестве примера к своему вопросу, таким образом, я могу получить лучшее представление о том, в чем Вы нуждаетесь? Также включайте свой желаемый вывод. –  terdon♦ 01.08.2013, 20:00
  • 5
    Привет там, спасибо очень много, это почти работает на меня, однако я только, кажется, получаю полные соответствия, а не частичные соответствия. мышь –  Joe 01.08.2013, 20:23

Если файлы как в Вашем примере отсортированы и всегда следуют за тем шаблоном, Вы могли записать это:

join -t/ -1 3 -2 3 123.txt 789.txt |
  sed -n 's,\([^/]*/\)\([^/]*://\)\2,\2\1,p'

Это было бы самым эффективным.

4
27.01.2020, 20:14

Теги

Похожие вопросы