Сравнение файлов на основе 5 полей с использованием Awk и Bash

Я хочу сравнить File1 и File2 (разделенные пробелами), используя пять полей (столбец 1,2,4,5,6).

* Логика: * Если столбцы 1 и 2 файлов File1 и File2 соответствуют точно, и если File2 имеет те же символы, что и любой из символов, присутствующих в столбцах 4 и 5 файла1, то эти строки file1 и file2 объединяются и перенаправляются в качестве вывода.

File1:

s2/80 20 . AT 86 N=2 F=5;U=4 s2/20 10 . GT 90 N=2 F=5;U=4 s2/90 60 . CG 30 N=2 F=5;U=4 

File2:

 s2/90 60 . GG 97 N=2 F=5;U=4 s2/80 20 . AA 20 N=2 F=5;U=4 s2/15 11 . AA 22 N=2 F=5;U=4 s2/90 21 . CC 82 N=2 F=5;U=4 s2/20 10 . GG 99 N=2 F=5;U=4 s2/80 10 . TG 11 N=2 F=5;U=4 s2/90 60 . GT 55 N=2 F=5;U=4 

Вывод:

 s2/80 20 . AT 86 N=2 F=5;U=4 s2/80 20 . AA 20 N=2 F=5;U=4 s2/20 10 . GT 90 N=2 F=5;U=4 s2/20 10 . GG 99 N=2 F=5;U=4 s2/90 60 . CG 30 N=2 F=5;U=4 s2/90 60 . GG 97 N=2 F=5;U=4 

Я новичок в этой области и буду признателен за любые рекомендации.

One Solution collect form web for “Сравнение файлов на основе 5 полей с использованием Awk и Bash”

Вот решение, использующее только awk . Поместите приведенный ниже код в файл с именем ex.awk :

 BEGIN{} FNR==NR{ k=$1" "$2 a[k]=$4" "$5 b[k]=$0 c[k]=$4 d[k]=$5 next } { k=$1" "$2 lc=c[k] ld=d[k] # file1 file2 if ((k in a) && ($4==$5) && (lc==$4) || (ld==$5)) print b[k]" "$0 } 

И затем запустите его так, как показано выше, двумя файлами:

 $ awk -f ex.awk file1 file2 

пример

Команда sed предназначена для форматирования вывода для StackExchange!

 $ awk -f ex.awk file1 file2 | sed 's/[ ]\+/ /g' s2/90 60 . CG 30 N=2 F=5;U=4 s2/90 60 . GG 97 N=2 F=5;U=4 s2/80 20 . AT 86 N=2 F=5;U=4 s2/80 20 . AA 20 N=2 F=5;U=4 s2/20 10 . GT 90 N=2 F=5;U=4 s2/20 10 . GG 99 N=2 F=5;U=4 

Изменение требований

OP упомянул в комментариях ниже, что он хотел бы, чтобы окончательное решение опускало любые строки, где 4-й и 5-й столбцы из file1 соответствовали 4-му и 5-му столбцам из file2 .

Например, добавьте эту строку в file1 и file2 :

 s2/40 40 . SS 90 N=2 F=5;U=4 

Однострочное дополнение к оригинальному решению может адресовать это конкретное изменение требований.

 if ((k in a) && (lc==$4) && (ld==$5)) next 

Новый пример

ex2.awk :

 BEGIN{} FNR==NR{ k=$1" "$2 a[k]=$4" "$5 b[k]=$0 c[k]=$4 d[k]=$5 next } { k=$1" "$2 lc=c[k] ld=d[k] if ((k in a) && (lc==$4) && (ld==$5)) next if ((k in a) && ($4==$5) && (lc==$4) || (ld==$5)) print b[k]" "$0 } 

Перезапуск нового скрипта awk , ex2.awk :

 $ awk -f ex2.awk file1 file2 | sed 's/[ ]\+/ /g' s2/90 60 . CG 30 N=2 F=5;U=4 s2/90 60 . GG 97 N=2 F=5;U=4 s2/80 20 . AT 86 N=2 F=5;U=4 s2/80 20 . AA 20 N=2 F=5;U=4 s2/20 10 . GT 90 N=2 F=5;U=4 s2/20 10 . GG 99 N=2 F=5;U=4 
  • Использование awk для обработки вывода ls с пробелами в именах файлов / пути
  • замените строку строки 6 после сопоставления строки
  • Как я могу удалить все между двумя маркерами в файле?
  • выбор строки из записи в файле
  • Выравнивание шаблона и удаление всей строки
  • Лишь оставлять самую длинную линию, когда первая колонка дублируется
  • Как получить дисковое пространство (Свободно) с помощью «df -h», когда файловая система длинная
  • Проверьте, является ли условие awk совпадением в лог-файле
  • Печать нескольких строк после n-го появления в bash
  • объединение двух файлов по 2 столбцам, но с разными номерами столбцов с использованием awk
  • Как использовать команду оболочки, чтобы показывать только первый столбец и последний столбец в текстовом файле?
  • Как я могу разбить набор слов на пары, которые должны совпадать?
  • Interesting Posts

    Восстановление пространства из одной файловой системы, чтобы передать его другому без LVM

    пользователь root отказал в доступе к .gvfs в rsnapshot?

    Как лучше всего включить конфигурацию Wi-Fi или Ethernet на встроенном устройстве?

    Можно ли повторно использовать первый аргумент линии BASH в одной строке?

    sed, конвертировать одиночную обратную косую черту в двойную обратную косую черту

    Задержка меню загрузки OpenSUSE

    Как исправить ошибку «xrandr: не удается найти вывод« VGA1 »?

    Создание туннеля от хоста до шлюза

    stty:: Недопустимый аргумент

    Как я могу уловить код выхода команды для более позднего, в Makefile?

    Исключительно высокий уровень использования памяти Android-студия и эмулятор

    Супер-медленная скорость локальной сети, если только скачивание через FTP-клиент Chrome

    Синтаксис массива с AWK

    Как установить заголовки Linux 3.2.40 на Synology DS214 с DSM 6.1?

    Получение ошибочной ошибки проверки подлинности в openldap

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