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