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

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

  • удалите первую строку файла, только если пустой с помощью sed
  • Сохранение первого экземпляра дубликатов
  • Как получить DISTRIB_CODENAME?
  • строка bash для int
  • Сценарий, который использует запрос MySQL для автоматического удаления вывода
  • Измените тему Xfce из сценария bash
  • Итерация над массивом bash
  • В bash, grep для строки, начинающейся с \, и присваивания результата с помощью обратных шагов
  • 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 
    Linux и Unix - лучшая ОС в мире.