Сравнение файлов на основе 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 

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

  • Разбиение в awk не на печать значений массива
  • Удалить все узлы <FOLDER>! = Значение тега
  • Как удалить последний столбец файла в Linux
  • Последовательности эвакуации, переданные как аргументы gawk, не интерпретируются
  • как очистить свободные строки / столбцы после строки ваших данных
  • Slurp-режим в awk?
  • Удалите строки на основе шаблона, но сохраняя первые n строк, которые соответствуют
  • Как удалить запятую и распечатать всю строку снова для слов, которые помещаются после запятой
  • 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 
    Interesting Posts

    Добавление строки текста в несколько файлов

    Установите MTP-устройство в FreeBSD

    Почему я не могу убить процесс SIGSTOP'd с помощью SIGTERM и где хранится ожидающий сигнал?

    вызовите сценарий оболочки с помощью переменной

    Как записывать более одного каталога?

    Почему mv не может сохранять разрешения при переходе между SD-картами Android?

    Как использовать результаты «файла» (Имя приложения: Microsoft Word) для поиска определенной строки?

    Как узнать имя ПК с ОС Windows в локальной сети по MAC-адресу?

    Может ли hexdump отображать свои текстовые переводы в альтернативных кодировках?

    Kubuntu не подключается к Wi-Fi после пробуждения от сна

    Как использовать / test pivot_root?

    восстановить файлы с локального файлового сервера

    Количество экранов X, соответствующих количеству разделов «Экран» в файле xorg.conf для конфигурации с несколькими мониторами

    В то время как цикл с результатом от функции – BASH

    Заменить процесс экрана с экрана

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