Ausgabeparameter beim Verbinden zweier Matrizen?

Ausgabeparameter beim Verbinden zweier Matrizen?

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 mat1hat etwa 20.000 Spalten, daher ist es nicht machbar, 1,1 1,2 … 1,20.000 zu schreiben. Welche Variation des -oParameters kann verwendet werden, um alle Spalten der Matrix eins anzugeben, und nur eine Spalte davon mat2wird 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 cutzunä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 mat1tun:

cut -f-19999 mat1 | join -t ' ' - <(cut -f1,4 mat2)

Antwort2

Eine gängige Methode zur Bewältigung solcher Aufgaben besteht darin, awkanstelle 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

verwandte Informationen