File1
enthä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
File2
enthä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, File1
die 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 ARGV
der 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, table
um 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 NR
der Gesamtzahl der bisher angezeigten Eingabedatensätze vergleicht.
awk -F'-' 'NR==FNR{table[$1] = $0}; NR>FNR{print table[$0]}' file_1 file_2