두 개의 행렬을 연결해야 합니다.
$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