Как добавить в файл столбец, который соответствует другому столбцу?

В файле resolv.conf не должно быть внешних DNS-серверов, чтобы гарантировать, что dnsmasq разрешает все DNS-запросы. Изменить на:

nameserver 127.0.0.1

Чтобы разрешить разрешение внешних DNS-имен, используйте dnsmasq в качестве глобального DNS-сервера, указав использовать какой-либо внешний DNS-сервер. Добавить в конфигурационный файл DNSmasq:

--server Specify IP address of upstream servers directly.

server=8.8.8.8

Чтобы заставить dnsmasq разрешать только имена, которые на самом деле могут быть глобальными именами dns, добавьте в файл конфигурации DNSmasq:

# Never forward plain names (without a dot or domain part)
domain-needed
# Never forward addresses in the non-routed address spaces.
bogus-priv

Чтобы убедиться, что локальные имена разрешаются с помощью /etc/hosts, добавьте в файл DNSmasq:

# Add local-only domains here, queries in these domains are answered
# from /etc/hosts or DHCP only.
local=/local./

Вы можете попробовать этот вариант (может быть полезен или нет):

# Set this (and domain: see below) if you want to have a domain
# automatically added to simple names in a hosts-file.
expand-hosts

# Set the domain for dnsmasq. this is optional, but if it is set, it
# does the following things.
# 1) Allows DHCP hosts to have fully qualified domain names, as long
#     as the domain part matches this setting.
# 2) Sets the "domain" DHCP option thereby potentially setting the
#    domain of all systems configured by DHCP
# 3) Provides the domain part for "expand-hosts"
domain=local
2
31.05.2021, 05:38
3 ответа

Возможно, вы могли бы сделать что-то подобное:

awk 'NR == FNR { x[$2]=$1; next} { print x[$1], $0 }' file1 file2

Где:

  • FNR:Номер входной записи в текущем входном файле.
  • NR :Общее количество входных записей, просмотренных на данный момент.

Обратите внимание, что при этом будет считано file1целиком в память.

5
28.07.2021, 11:28

Использованиеawk:

awk 'NR==FNR{ar[$2]=$0;next}($1 in ar){print ar[$1],$2}' file1 file2

В этой команде NR==FNRгарантирует, что {ar[$2]=$0;next}будет работать только для первого файла, потому что после чтения первого файла FNRбудет установлен на ноль. В выражении {ar[$2]=$0;next}создается массив ar, индексированный по $2, и с nextникаких дальнейших действий не предпринимается.

Выражение ($1 in ar)определяет, присутствует ли$1(первое поле второго файла )в индексах массива ar. Если присутствует, то это печатает arи второе поле второго файла с помощью этого оператора {print ar[$1],$2}.

($1 in ar)важно, потому что это означает, соответствует ли $1 второго файла индексам из ar. А arиндексируется по $2 первого файла. Итак, это проверяет, соответствует ли $1второго файла $2первого файла.

2
28.07.2021, 11:28

Если вы не заботитесь о сохранении исходного порядка файлов, вы можете использоватьjoin:

# sort the first file:
sort -k2 file1 > nfile1

# Sort the second file:
sort file2 > nfile2

join -1 2 -2 1 -o 1.1,1.2,2.2 nfile1 nfile2 > joined_file

Или, как предложил @Ed Morton, если вы используете bashили любую другую оболочку, которая поддерживает замещение процессов, вы можете избежать создания временных файлов таким образом:

join -1 2 -2 1 -o 1.1,1.2,2.2 <(sort -k2 file1) <(sort file2)
5
28.07.2021, 11:28

Теги

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