Сравнение столбцов в 2 файлах и вывод отличающихся значений

Сравнение столбцов в 2 файлах и вывод отличающихся значений

У меня есть файл (file-1), который выглядит так:

DIP-10097N|refseq:NP_416170|uniprotkb:P30015
DIP-10117N|refseq:NP_414973|uniprotkb:P08177
DIP-10168N|refseq:NP_418766|uniprotkb:P15005
DIP-10199N|refseq:NP_415632|uniprotkb:P30958
DIP-10358N|refseq:NP_418659|uniprotkb:P28903
DIP-10440N|refseq:NP_289596|uniprotkb:P20082
DIP-10441N|refseq:NP_417502|uniprotkb:P20083
DIP-10441N|refseq:NP_417502|uniprotkb:P20083
DIP-10467N|refseq:NP_415423|uniprotkb:P09373
DIP-10469N|refseq:NP_418386|uniprotkb:P32674
DIP-10562N|refseq:NP_418370|uniprotkb:P17888
DIP-10582N|refseq:NP_414864|uniprotkb:P77743
DIP-10592N|refseq:NP_415819|uniprotkb:P37344

и еще один (файл-2), который выглядит так,

DIP-10331N|refseq:NP_311078|uniprotkb:P12638     DIP-10117N|refseq:NP_414973|uniprotkb:P08177
DIP-10331N|refseq:NP_311078|uniprotkb:P12638    DIP-10840N|refseq:NP_414640|uniprotkb:P10408
DIP-1025N|refseq:NP_414574|uniprotkb:P00968     DIP-10097N|refseq:NP_416170|uniprotkb:P30015
DIP-10467N|refseq:NP_415423|uniprotkb:P09373    DIP-10097N|refseq:NP_416170|uniprotkb:P30015
DIP-10117N|refseq:NP_414973|uniprotkb:P08177    DIP-10117N|refseq:NP_414973|uniprotkb:P08177
DIP-10117N|refseq:NP_414973|uniprotkb:P08177    DIP-10750N|refseq:NP_289799|uniprotkb:P02410
DIP-10117N|refseq:NP_414973|uniprotkb:P08177    DIP-10757N|refseq:NP_288150|uniprotkb:P02421

В выводе я хочу вывести содержимое файла file-1 плюс значение в любом столбце файла file-2, которое имеет то же значение, что и file-1 в другом столбце. Вот так,

DIP-10097N|refseq:NP_416170|uniprotkb:P30015 DIP-1025N|refseq:NP_414574|uniprotkb:P00968
DIP-10097N|refseq:NP_416170|uniprotkb:P30015 DIP-10467N|refseq:NP_415423|uniprotkb:P09373
DIP-10117N|refseq:NP_414973|uniprotkb:P08177 DIP-10117N|refseq:NP_414973|uniprotkb:P08177
DIP-10117N|refseq:NP_414973|uniprotkb:P08177 DIP-10750N|refseq:NP_289799|uniprotkb:P02410
DIP-10117N|refseq:NP_414973|uniprotkb:P08177    DIP-10757N|refseq:NP_288150|uniprotkb:P02421
DIP-10117N|refseq:NP_414973|uniprotkb:P08177 DIP-10331N|refseq:NP_311078|uniprotkb:P12638
DIP-10467N|refseq:NP_415423|uniprotkb:P09373 DIP-10097N|refseq:NP_416170|uniprotkb:P30015

Есть ли способ сделать это с помощью awk или grep? Любая помощь будет высоко оценена.

решение1

Это широко известная операция вawk— собрать массив из файла-ключа, а затем использовать массив для работы со значениями второго файла

awk '
    FNR==NR{
            A[$2] = A[$2] " " $1
            next
    }
    $1 in A{
            for(i=1;i<=split(A[$1], B);i++)
                print $1 B[i]
    }
    ' file2 file1

Или немного короче:

awk '
    FNR==NR{
            A[$2] = A[$2] $2 " " $1 "\n"
            next
    }
    $1 in A{
            printf "%s", A[$1]
    }
    ' file2 file1

Другой вариант

grep -f <(cat -E file1) file2 |
sed 's/\(\S*\)\s*\(\S*\)/\2\t\1/' |
sort

Наконец, самое простое (как по мне):

join -2 2 file1 <(sort -k2 file2)

Связанный контент