Допущения:
- CSV-файл (с 2 столбцами: имя домена + IP-адрес) использует запятую (
,
) в качестве разделителя (это не показано в примерах данных, но ФП упомянул об этом в комментарии) - не упоминается о каких-либо требованиях к сортировке окончательного вывода в каком-либо конкретном порядке, поэтому я распечатаю вывод в том же порядке:
- ips происходят в первом файле
- адреса доменов встречаются в файле csv
- образец не был предоставлен для первого файла, поэтому я собираюсь предположить один ip адрес на строку
- Я не буду беспокоиться о возможности появления IP-адреса более одного раза в первом файле (ie, мы просто будем неоднократно печатать одни и те же доменные имена каждый раз IP-адрес отображается в первом файле)
- любые записи в любом файле без «соответствия» в другом файле не будут отображаться в конечном выводе
Пример данных:
$ cat domain.dat
example.com,1.1.1.1
example3.com,3.4.5.6
example5.com,11.12.13.14
exampleX.com,99.99.99.99 # no matches in ip.dat
example2.com,1.1.1.1
example4.com,11.12.13.14
$ cat ip.dat
1.1.1.1
2.2.2.2 # no matches in domain.dat
3.4.5.6
7.8.9.10 # no matches in domain.dat
11.12.13.14
1.1.1.1 # repeat of an ip address
Это awk
решение начинается с обработки domain.dat
для заполнения массива (domains[<ipaddress>]=<domainaddress>[,<domainaddress]*
), затем обрабатывается ip.dat
для определения того, какие доменные адреса следует печатать на стандартный вывод:
awk -F "," '
# first file: keep track of the longest domain address; to be used by printf
NR==FNR { if (length($1) > maxlen) { maxlen=length($1) } }
# first file: if the ip address is already an index in our array then append the current domain address to the array element; skip to next of input
(NR==FNR) && ($2 in domains) { domains[$2]=domains[$2]","$1 ; next }
# first file: first time we have seen this ip address so create a new array element, using the ip address as the array index; skip to next line of input
NR==FNR { domains[$2]=$1 ; next}
# second file: if the ip address is an index in our array ...
# split the domain address(es), delimited by comma, into a new array named "arr" ...
( $1 in domains ) { split(domains[$1],arr,",")
# set the output line suffix to the ip address
sfx=$1
# loop through our domain addresses, appending the ip address to the end of the first line; after we print the first domain
# address + ip address, reset suffix to the empty string so successive printfs only display the domain address;
# the "*" in the format string says to read the numeric format from the input parameters - "maxlen" in this case
for (i in arr) { printf "%-*s %s\n",maxlen,arr[i],sfx ; sfx="" }
}
' domain.dat ip.dat
ПРИМЕЧАНИЕ. Встроенные комментарии можно удалить в уменьшить беспорядок.
Результаты выполнения выше:
example.com 1.1.1.1
example2.com
example3.com 3.4.5.6
example5.com 11.12.13.14 # example5.com comes before example4.com in domain.dat
example4.com
example.com 1.1.1.1 # repeated because 1.1.1.1 was repeated in ip.dat
example2.com