Suchen nach Mustern zwischen zwei Dateien

Suchen nach Mustern zwischen zwei Dateien

File1enthält eine Liste von Genen (dargestellt durch die Buchstaben). Jedes Gen wird durch das Protein beschrieben, das es exprimiert (dargestellt durch die Buchstaben):

a-1
b-2
c-3

File2enthält ebenfalls eine Liste von Genen, aber jedes davon wird mehrfach wiederholt. Einige dieser Gene ähneln denen von File1:

a
a
a
b
b
c
c
c

Ich muss alle Gene in finden, File1die in häufig vorkommen File2. Die häufig vorkommenden Gene müssen in eine dritte Datei gedruckt werden (auch die Mehrfachkopien). Außerdem muss der Proteintyp, den die Gene exprimieren, ebenfalls mitgeschrieben werden (genau wie in File1).

Wie kann ich Folgendes erhalten File3?

a-1
a-1
a-1
b-2
b-2
c-3
c-3
c-3

Antwort1

Hier sehen Sie eine einfache Möglichkeit, dies mit gawk zu tun. Gawk verfügt über eine integrierte Variable ARGIND, den Index ARGVder aktuell verarbeiteten Datei.

Wir teilen jede Eingabezeile der ersten Datei auf -und verwenden das erste Feld zum Indexieren in ein Array table, das die gesamte Zeile speichert. Für die zweite Datei (und alle folgenden Dateien) verwenden wir die gesamte Zeile als Index, tableum die gewünschte Zeile abzurufen.

BEGIN{FS = "-"}
ARGIND==1{table[$1] = $0}
ARGIND>1{print table[$0]}

Oder als Einzeiler:

awk 'BEGIN{FS = "-"}; ARGIND==1{table[$1] = $0}; ARGIND>1{print table[$0]}' file_1 file_2

Hier ist eine andere Version, die mit herkömmlichem awk funktioniert. Sie ermittelt, ob die aktuelle Datei die erste Datei ist FNR, indem sie die Eingabedatensatznummer in der aktuellen Eingabedatei mit NRder Gesamtzahl der bisher angezeigten Eingabedatensätze vergleicht.

awk -F'-' 'NR==FNR{table[$1] = $0}; NR>FNR{print table[$0]}' file_1 file_2

verwandte Informationen