두 개의 파일을 결합된 열이 있는 단일 파일로 병합합니다.

두 개의 파일을 결합된 열이 있는 단일 파일로 병합합니다.

두 파일의 모든 열을 포함하는 하나의 파일로 두 파일을 병합해야 합니다.

샘플 파일을 제공합니다. 파일 1

chr loc T1  C1
chr1    100 2   3
chr1    200 3   4
chr2    100 1   4
chr2    400 3   1

파일 2

chr loc T2  C2
chr1    100 1   2
chr1    300 4   1
chr2    100 7   5
chr2    500 1   9

출력 파일은 다음과 같아야합니다

결과물 파일

chr loc T1  C1  T2  C2
chr1    100 2   3   1   2
chr1    200 3   4   0   0
chr1    300 0   0   4   1
chr2    100 1   4   7   5
chr2    400 3   1   0   0
chr2    500 0   0   1   9

답변1

join -a1 -a2 -e 0 -o 0,1.2,1.3,2.2,2.3 \
    <(sed 's/ \+/_/' file1 | sort) \
    <(sed 's/ \+/_/' file2 | sort) | 
sed 's/_/ /' | 
column  -t | 
sort
chr   loc  T1  C1  T2  C2
chr1  100  2   3   1   2
chr1  200  3   4   0   0
chr1  300  0   0   4   1
chr2  100  1   4   7   5
chr2  400  3   1   0   0
chr2  500  0   0   1   9

sed여기서 가장 까다로운 부분은 join단일 필드에만 조인하는 이유입니다. 여기서 조인 기준은 처음 2개 필드입니다. 따라서 이러한 필드를 단어로 결합해야 합니다. 첫 번째 공백 시퀀스를 밑줄로 바꾸어 조인이 표시되도록 합니다 chr1_100.chr1_200

join입력 파일을 정렬해야 합니다.

나는 사용한다프로세스 교체이는 join파일과 마찬가지로 파이프에서도 작동합니다 sed|sort.

그런 다음 sed다시 호출하여 결합된 필드를 취소하고 column멋지게 만듭니다.

기본적으로 join각 파일의 첫 번째 필드가 키 필드로 사용됩니다.

기본적으로 join실행 여부는내부 조인: 두 파일 모두에 있는 키만 인쇄합니다. -a1옵션을 사용하면 -a2우리가 원하는 완전한 외부 연결이 가능해집니다. 이 -e옵션은 빈 필드에 대한 기본값을 제공합니다. -o모든 필드를 지정하려면 이 옵션이 필요합니다.


awk를 사용할 수도 있습니다.

awk '
    {key = $1 OFS $2} 
    NR == FNR {f1[key] = $3; f2[key] = $4; next} 
    !(key in f1) {print $1, $2, 0, 0, $3, $4; next} 
    {print key, f1[key], f2[key], $3, $4; delete f1[key]} 
    END {for (key in f1) print key, f1[key], f2[key], 0, 0}
' file1 file2 | sort
chr loc T1 C1 T2 C2
chr1 100 2 3 1 2
chr1 200 3 4 0 0
chr1 300 0 0 4 1
chr2 100 1 4 7 5
chr2 400 3 1 0 0
chr2 500 0 0 1 9

관련 정보