Объединение двух файлов с использованием совпадающих символов

Для Ubuntu я добавил в /etc/sudoers. d/ со строкой:

 ALL=(ALL:ALL) ALL

Используя команду:

visudo -f /etc/sudoers.d/

Это рекомендуется, поскольку оставляет файл /etc/suoders нетронутым и таким образом позволяет избежать конфликта (и требуемого последующего ручного разрешения) при обновлении. См: Почему /etc/sodoers.d/

1
02.05.2019, 20:33
2 ответа

Вы можете сделать это с помощью sed, однако версия редактора Gnuможет сделать регулярное выражение менее шумным.

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

Затем мы читаем Файл1 и добавляем строки Файла2 из удержания к только что -прочитанной строке Файла1. Если мы можем обнаружить наличие строки File1 в области хранения, то все готово, и мы печатаем строку File2 как есть, сокращая пространство шаблонов других вещей.

В противном случае мы печатаем строку File1 с добавленным 0.

$ sed -Ee '
    / /{H;d;}
    G
    s/^(\S+)\n.*\n(\1 \S+)(\n.*)?$/\2/;t
    s/\n.*/ 0/
' File2 File1
0
27.01.2020, 23:22

Вы можете сделать это в Awkочень легко!

awk 'FNR==NR{ hash[$1]=$2; next}{ if ($0 in hash) $2 = hash[$1]; else  $2 = "0" }1' file2 file1

Awkработает, обрабатывая входные строки по одной за раз. И есть специальные пункты, которые обеспечивают Awk, BEGIN{}и END{}, которые заключают в себе действия, которые должны выполняться до и после обработки файла. Каждая строка в файле разделена на основе значения специальной переменнойFS(по умолчанию одного или нескольких пробелов ), и доступ к этим отдельным полям можно получить из $1, $2...$NF

Таким образом, часть FNR==NRпредназначена для обработки первого аргумента файла, указанного в команде, потому что FNRотслеживает номера строк для обоих объединенных файлов, а NR— только для текущего файла. Таким образом, для каждого $1в первом файле значения хешируются в массив с именем hash, а затем, когда происходит обработка следующего файла, часть $0 in hashотображает эти строки в file1. ], где присутствуют хешированные индексы из file2. Для таких отображенных строк мы печатаем их эквивалентные значения, а для не-отображаемых строк мы печатаем 0.

{..}1— это краткое -ручное представление, которое нужно выполнить {..; print}для восстановления/печати всей строки на основе модификации отдельных полей или любой из указанных специальных переменных.

Подробнее о Встроено -в разделе «Переменные, управляющие awk»

3
27.01.2020, 23:22

Теги

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