Vergleichen von Spalten in zwei Dateien und Drucken der unterschiedlichen Werte

Vergleichen von Spalten in zwei Dateien und Drucken der unterschiedlichen Werte

Ich habe eine Datei (Datei-1), die so aussieht:

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

und eine andere (Datei 2), die so aussieht,

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

In der Ausgabe möchte ich den Inhalt von Datei-1 plus den Wert in einer Spalte von Datei-2 drucken, der den gleichen Wert hat wie der von Datei-1 in der anderen Spalte. So,

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

Gibt es eine Möglichkeit, dies mit awk oder grep zu tun? Für jede Hilfe wäre ich sehr dankbar.

Antwort1

Dies ist eine weithin bekannte Operation inawk– Sammeln Sie ein Array aus der Schlüsseldatei und verwenden Sie dann das Array, um mit den Werten der zweiten Datei zu arbeiten

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

Oder etwas kürzer:

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

Andere Variante

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

Zuletzt am einfachsten (für mich):

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

verwandte Informationen