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

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

Большинство списков будут иметь две записи для 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. префикс.

  • Искать текст в Linux, но не отображать полную строку в результатах
  • Шаблон Regex для замены нескольких значений с помощью sed
  • Текст обтекания и отступов с использованием coreutils
  • Как заменить начальный ноль пробелом в SED?
  • sed: многострочная замена блока конфигурации
  • Как я могу группировать числа в файле
  • sed с множественным выражением для аргумента на месте
  • Как сопоставить шаблон и заменить только часть шаблона?
  • Преобразование таблицы csv в HTML
  • Как я могу упростить эту команду только для использования awk?
  • Как удалить часть строки
  • Поиск файла для числа, которое находится между двумя конкретными номерами
  • Linux и Unix - лучшая ОС в мире.