두 행렬을 결합할 때 출력 매개변수는 무엇입니까?

두 행렬을 결합할 때 출력 매개변수는 무엇입니까?

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

$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개의 열만 필요합니다.

답변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

관련 정보