AWK Сравнить столбец 1 из двух файлов Распечатать столбец добавления к третьему на выходе

Глядя на сравнение первого столбца из двух входных файлов, имеющих одинаковый формат. Формат выглядит следующим образом:

FILE1: 0000abc5abc3 GR096 0000def5ae87 GR001 0000cab5aea3 GR001 0000bac5aeeb GR001 0000fed5af13 GR001 0000efd5b16f GR001 0000cba5b187 GR001 0000bca5b2a3 GR001 FILE2: 0000abc5abc3 GR097 0000def5ae87 GR001 0000cab5aea3 GR001 0000bac5aeeb GR001 0000fed5af13 GR123 0000cba5b187 GR169 

Столбец 1 содержит MAC-адреса как в файлах FILE1, так и в FILE2. Я хочу, чтобы значение столбца 1 в FILE1 проверялось на столбец 1 в FILE2, и если есть соответствие для вывода значения столбца 1 и столбца 2 файла FILE1 и значения столбца 2 в FILE2 в качестве третьего столбца таким образом.

 DESIRED OUTPUT: 0000abc5abc3 GR096 GR097 0000def5ae87 GR001 GR001 0000cba5b187 GR001 GR169 

Каждый файл содержит несколько миллионов записей. Запуск ввода в bash вечно медленный и неэффективный, используя циклы while, проходящие через каждую запись:

 while read -r mac1 code1; do while read -r mac2 code2 ; do if [ "$mac1" == "$mac2" ]; then printf "%s %s %s\n" "$mac1" "$code1" "$code2" fi done < "$FILE1" done < "$FILE2" > OUTPUTFILE 

Awk значительно быстрее для меня использует массивы, но я не могу напечатать этот второй столбец FILE2 в третьем столбце вывода, используя синтаксис, как показано ниже. Этот синтаксис второй раз печатает столбец 2:

 awk 'NR==FNR { n[$1] = $1; n[$2] = $2; next } ($1 in n) { print n[$1],n[$2],$2 }' 

Мое предпочтение – AWK, но если его можно запустить в bash так же быстро, я в порядке с этим.

Описание: Если значение в столбце 1 в файле1 найдено в файле2, напечатайте значение столбца 1, столбец 2 (файл1) и столбец2 (файл2).

3 Solutions collect form web for “AWK Сравнить столбец 1 из двух файлов Распечатать столбец добавления к третьему на выходе”

если выход можно сортировать:

 join <(sort file1.txt) <(sort file2.txt) 

Чтобы исправить ваш awk:

 awk 'NR==FNR { n[$1]=$0;next } ($1 in n) { print n[$1],$2 }' file1 file2 #Output: 0000abc5abc3 GR096 GR097 0000def5ae87 GR001 GR001 0000cab5aea3 GR001 GR001 0000bac5aeeb GR001 GR001 0000fed5af13 GR001 GR123 0000cba5b187 GR001 GR169 

join является подходящим инструментом для этого:

 join <(sort file1) <(sort file2) 

Поскольку он работает с отсортированными файлами, я использую подстановку процесса bash ( <(...) ) для сортировки каждого файла, прежде чем загружать их для join .

  • добавьте «#» в начале выбранных строк в файле
  • Параметр одиночного кавычки сценария Bash с параметром globbing
  • Как использовать `gnome-terminal` с новой архитектурой клиент / сервер в качестве оболочки?
  • Как пропустить первый аргумент в скрипте
  • Сценарий для подключения с ssh к удаленному серверу с паролем
  • Создание мастер-процесса и подключение подчиненных процессов
  • Ссылка на переменные массива bash из другого массива
  • Команды настройки монитора не работают в скрипте
  • Печатать содержимое файла и удалять напечатанное содержимое * из файла
  • Как передать содержимое файла в виде нескольких аргументов в bash
  • Я случайно скопировал часть каталога / * to / some /, как мне исправить мою ошибку?
  • Interesting Posts

    Каков правильный способ разблокировать корневую файловую систему, охватывающую два устройства LUKS, только однажды введя пароль, используя systemd?

    Как изменить точки монтирования

    Почему «исходная» команда Баша ведет себя по-разному при вызове функции?

    Вызов bash getopts из функции не срабатывает 2-й раз

    Почему удаление ножей Iceweasel GNOME?

    Gzip, но исключая некоторые файлы каталогов и также добавляя текущую дату

    использовать результат поиска взамен инструкции с заменой vim

    Разархивировать определенные файлы из нескольких ZIP-файлов

    Я пытаюсь скомпилировать alsa-driver-RTv5.18, но получить дату-время ошибки для gcc 4.9.2

    Почтовый ящик, который отображает любой файл mbox или Maildir

    acpi_listen: невозможно открыть сокет /var/run/acpid.socket: нет такого файла или каталога

    Не удается добавить маршрут

    Замените файл с разделителями-запятыми на канал, но не удаляйте запятую или кавычки и т. Д. В поле определения текста, однако удалите спецификатор текста!

    уровни сжатия gz и xz

    ошибка монтирования (13): разрешение отклонено

    Linux и Unix - лучшая ОС в мире.