Объединение двух текстовых файлов на основе общего поля (IP-адрес)

bash file unix join awk

568 просмотра

3 ответа

181 Репутация автора

File1

abcd-efg|random1||abcd|10.10.1.1||
bcde-ab|random2||bc|10.1.2.2||
efgh-bd|ramdom3||fgh|10.2.1.1||
ijkl|random4||mno|10.3.2.3||

File2

10.10.1.1| yes
10.1.2.2| no
10.2.1.1| yes
10.3.2.3| no

Выход должен быть

abcd-efg|random1||abcd|10.10.1.1||yes
bcde-ab|random2||bc|10.1.2.2||no
efgh-bd|ramdom3||fgh|10.2.1.1||yes
ijkl|random4||mno|10.3.2.3||no

Я пытался объединить оба текстовых файла, основанные на IP-адресе, используя awk и joins, но некоторые не смогли получить правильный вывод.

Не могли бы вы помочь мне пройти через правильный вывод. Спасибо заранее

Автор: Babu Источник Размещён: 19.07.2016 01:01

Ответы (3)


0 плюса

84272 Репутация автора

Решение
$ awk -F'|' 'FNR==NR{a[$1]=$2; next} {print $0 a[$5]}' file2 file1
abcd-efg|random1||abcd|10.10.1.1|| yes
bcde-ab|random2||bc|10.1.2.2|| no
efgh-bd|ramdom3||fgh|10.2.1.1|| yes
ijkl|random4||mno|10.3.2.3|| no

Этот подход будет работать, даже если IP-адреса находятся в файлах в разных порядках.

Как это устроено

  • -F'|'

    Установите разделитель полей на входе в |.

  • FNR==NR{a[$1]=$2; next}

    При чтении первого файла file2сохраните второе поле как значение в ассоциативном массиве aпод ключом первого поля. Пропустить оставшиеся команды и перейти к nextстроке.

  • print $0 a[$5]

    Если мы попадаем сюда, мы работаем над вторым файлом file1. Выведите строку с последующим значением aдля этого IP.

BSD / OSX

В BSD (OSX) awk попробуйте:

awk -F'|' 'FNR==NR{a[$1]=$2; next;} {print $0 a[$5];}' file2 file1
Автор: John1024 Размещён: 19.07.2016 01:14

0 плюса

1798 Репутация автора

Команда Unix join может быть использована для этого

join -t\| -j1 5 -j2 1 -o1.1,1.2,1.3,1.4,1.5,1.6,2.2 file1 file2

Объяснение вариантов:

-t\| : Разделитель полей: '|' (Бежал)

-j1 5 -j2 1 : Объединение на основе 5-го поля файла1 и 1-го поля файла2

-o1.1,1.2,1.3,1.4,1.5,1.6,2.2 : Вывести 6 полей из файла1 и 2-е поле из файла2

Если входные файлы не отсортированы, они должны быть отсортированы в первую очередь, как показано ниже

join -t\| -j1 5 -j2 1 -o1.1,1.2,1.3,1.4,1.5,1.6,2.2 <(sort -t'|' -k5 file1)  <(sort -t'|' -k1 file2)
Автор: ramana_k Размещён: 19.07.2016 02:15

0 плюса

12863 Репутация автора

Предполагая, что оба файла имеют IP-адрес в том же порядке, как показано в примере OP

paste -d'\0' file1 <(cut -d' ' -f2 file2)
  • cut -d' ' -f2 file2 выберите второй столбец файла2, разделение столбцов - пробел, указанный разделителем -d' '
  • Используя подстановку процесса , вывод cutкоманды передается в качестве ввода файла в pasteкоманду
  • pasteЗатем команда объединяет file1 и вывод cutстолбца без каких-либо символов между ними (ссылка: вставка без разделителя )
Автор: Sundeep Размещён: 19.07.2016 04:15
Вопросы из категории :
32x32