Скопируйте текстовые строки из файла и добавьте их в один и тот же файл с префиксом средней линии или удалите префикс средней строки

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

Большинство списков будут иметь две записи для URL-адреса, один с www. и один без этого:

 127.0.0.1 facebook.com 127.0.0.1 www.facebook.com 

Однако некоторые из моих списков не удваиваются, и я хочу их. У меня есть много таких разрозненных URL:

 127.0.0.1 twitter.com 127.0.0.1 www.facebook.com 127.0.0.1 subdomain.facebook.com 127.0.0.1 tumblr.com 127.0.0.1 www.reddit.com 

Я бы хотел просмотреть файл для URL-адресов, которые перечислены для проверки всех строк без www. иметь соответствующую строку с www. , и что все строки с www. иметь соответствие, как без www. , Затем я хочу добавить любые отсутствующие строки в список, чтобы мой список выглядел так:

 127.0.0.1 twitter.com 127.0.0.1 www.twitter.com 127.0.0.1 facebook.com 127.0.0.1 subdomain.facebook.com 127.0.0.1 www.facebook.com 127.0.0.1 www.subdomain.facebook.com 127.0.0.1 tumblr.com 127.0.0.1 www.tumblr.com 127.0.0.1 reddit.com 127.0.0.1 www.reddit.com 

Он не должен быть в порядке, я могу просто добавить все недостающие строки в конце файла, потому что я запускаю sort -u как последний шаг.

2 Solutions collect form web for “Скопируйте текстовые строки из файла и добавьте их в один и тот же файл с префиксом средней линии или удалите префикс средней строки”

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

 sed '/ www./{ # if line matches www. h # copy it over the hold buffer s// / # remove the www. part G # append the original line to the modified one } //!{ # if line doesn't match www. h # copy it over the hold buffer s/ / www./ # add the www. part G # append the original line to the modified one } ' infile | sort -u 

Это предполагает, что два столбца (IP и URL) ограничены пробелом. При необходимости отрегулируйте регулярное выражение.


Или, с zsh , вы можете прочитать строки в массиве, удалить www. где присутствует и хранит результат в массиве уникальных элементов, затем печатайте каждый элемент дважды, один раз, как есть, и один раз с www. добавлена ​​часть:

 mylist=(${(f)"$(<infile)"}) for i (${(u)mylist[@]/ www./ }) printf '%s\n' ${i} ${i/ / www.} 

Вы можете использовать следующий скрипт awk :

script.awk:

 { gsub("www.", "", $2) address[$2] } END{ for (item in address){ print("127.0.0.1", item) print("127.0.0.1", "www." item) } } 

Вызовите его с помощью

 awk -f script.awk input 

Он удаляет www. в начале из всех записей, а затем заполняет массив (без значения). Если значение уже существует, оно просто перезаписывает его, поэтому вам не нужно заботиться о дубликатах. В конце мы печатаем содержимое массива, как только оно есть, и один раз с www. префикс.

  • Как проверить, имеет ли файл уже строку с содержимым?
  • array выводит все испорченные?
  • Как связывать линии между шаблоном начала и конца?
  • Объединение двух частей вместе для создания единого сценария
  • Как мне искать файл для строки, а затем использовать его как переменную?
  • Как печатать текст между первым вступлением пары строк?
  • Удалить диапазон строк над шаблоном с помощью sed (или awk)
  • Как выполнить инструкцию IF из результата выполненной команды
  • Как разбить файл на основе информации в столбце в Linux
  • Объединить вывод сценария в тело письма и отправить его как одно электронное письмо?
  • sed снятие комментариев в строке
  • Linux и Unix - лучшая ОС в мире.