두 행렬의 출력 매개변수를 연결하시겠습니까?

두 행렬의 출력 매개변수를 연결하시겠습니까?

두 개의 행렬을 연결해야 합니다.

$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  

내 실제 행렬에는 mat1약 20,000개의 열이 있으므로 1.1 1.2 ..1.20,000을 작성하는 것은 불가능합니다. -o행렬 1의 모든 열을 설명하는 데 어떤 매개 변수 변형을 사용할 수 있으며 mat2최종 병합 행렬로는 그 중 하나만 필요합니다.

답변1

-o(에서 )에는 해당 옵션이 없습니다 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.

cut먼저 적절한 열을 선택한 다음 조인하세요 .

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

(예: 따옴표 사이의 탭: Ctrl+ V, TAB)
또는 19999까지의 모든 열에 대해 mat1다음을 수행할 수 있습니다.

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

답변2

이러한 작업을 처리하는 일반적인 방법은 awk대신 사용하는 것입니다 join. 먼저 한 파일의 항목에서 연관 배열을 구성한 다음 공통 열을 키로 사용하여 다른 파일을 처리할 때 해당 값을 조회합니다. 당신의 상황을 예로 들어보자

$ 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

관련 정보