Ich muss zwei Matrizen verbinden.
$cat mat1
:
sample gen1 gen2 gen3 gen4
pt1 1 4 7 10
pt3 5 5 8 11
pt4 3 6 9 12
$cat mat2
:
sample age gender stage etc
pt0 5 m stage1 poi
pt1 6 f stage2 bmn
pt2 9 m stage3 yup
pt3 7 f stage4 qaz
pt4 6 f stage2 bmn
$join -o 1.1 1.2 1.3 1.4 2.4 mat1 mat2
:
sample gen1 gen2 gen3 stage
pt1 1 4 7 stage2
pt3 5 5 8 stage4
pt4 3 6 9 stage2
Meine tatsächliche Matrix mat1
hat etwa 20.000 Spalten, daher ist es nicht machbar, 1,1 1,2 … 1,20.000 zu schreiben. Welche Variation des -o
Parameters kann verwendet werden, um alle Spalten der Matrix eins anzugeben, und nur eine Spalte davon mat2
wird als endgültige zusammengeführte Matrix benötigt.
Antwort1
Es gibt keine solche Option für -o
(von man join
):
-o FORMAT
obey FORMAT while constructing output line
FORMAT is one or more comma or blank separated
specifications, each being `FILENUM.FIELD' or `0'. Default FORMAT
outputs the join field, the remaining fields from FILE1, the remaining
fields from FILE2, all separated by CHAR. If FORMAT is the keyword
'auto', then the first line of each file determines the number of
fields output for each line.
Über cut
zunächst die entsprechenden Spalten auswählen und dann verknüpfen:
join -t ' ' mat1 <(cut -f1,4 mat2)
(das ist ein Tabulatorzeichen zwischen den Anführungszeichen: Ctrl+ V, TAB),
oder Sie können für alle Spalten bis 19999 Folgendes mat1
tun:
cut -f-19999 mat1 | join -t ' ' - <(cut -f1,4 mat2)
Antwort2
Eine gängige Methode zur Bewältigung solcher Aufgaben besteht darin, awk
anstelle von zu verwenden join
: zuerst ein assoziatives Array aus den Einträgen in einer Datei zu erstellen und dann beim Verarbeiten der anderen Datei die entsprechenden Werte nachzuschlagen, wobei die gemeinsame Spalte als Schlüssel verwendet wird. In Ihrem Fall zum Beispiel
$ awk 'NR==FNR {stage[$1]=$4; next;}; {print $0,stage[$1]}' mat2 mat1
sample gen1 gen2 gen3 gen4 stage
pt1 1 4 7 10 stage2
pt3 5 5 8 11 stage4
pt4 3 6 9 12 stage2