Join/awk를 사용하여 한 테이블에서 값을 찾아 다른 테이블에 출력

Join/awk를 사용하여 한 테이블에서 값을 찾아 다른 테이블에 출력

표 1(탭으로 구분됨):

NC_000001.11 1243 A T 0.14 
NC_000005.11 1432 G C 0.0006 
NC_000012.12 1284 A T 0.93428 
NC_000021.9 9824 T C 0.9

조회 테이블(탭으로 구분) - 실제로 gzip 이후 약 6G로 상당히 큽니다.

 NC_000001.11 1243 rs73647921 A   T  
 NC_000005.11 1432 rs75444    G   C
 NC_000012.12 1284 rs754723 A T  
 NC_000021.9 9824 rs865545  T C 

조회 테이블의 열 1/2/4/5에 해당하는 테이블 1의 처음 4개 열과 일치하는 출력을 원합니다.

MarkerName P-Value
rs73647921 0.14
rs75444    0.0006
rs754723 0.93428 
rs865545  0.9

다음과 같이 Join을 사용해야 한다고 생각합니다.

join -t, -a 1 -a 2 -o0,1.5,2.3 -e ' -' file1 file2

그러나 이것은 작동하지 않는 것 같습니다. gzip을 사용하여 파일을 어떻게 압축할 수 있나요?

답변1

awk (및 bash)를 사용하면 작성할 수 있습니다

awk '
    BEGIN {FS = OFS = "\t"}
    NR == FNR {pvalue[$1,$2,$3,$4] = $5; next}
    FNR == 1 {print "MarkerName", "P-Value"}
    { key = $1 SUBSEP $2 SUBSEP $4 SUBSEP $5
      sub(/\r$/, "", key)
    }
    key in pvalue {print $3, pvalue[key]}
' table1.tsv <(zcat lookup.tsv.gz)

awk는 SUBSEP 변수를 사용하여 쉼표로 구분된 배열 인덱스를 연결합니다.

zcat에 대한 마지막 구문은 bash입니다.프로세스 교체

다중 필드 조인 조건의 경우 join처리하기 어려울 수 있습니다. 파일이 정렬되지 않은 경우에도 불평을 표시합니다.

답변2

해보셨나요..?

join -o 2.3,1.5 f1 <(zcat f2.gz )

기본적으로 join첫 번째 필드가 사용됩니다. (및 와 -1 x -2 x동일하며 -j x-j 1동일합니다 " ")

나는 가정한다

  • 파일이 정렬되어 있고,
  • 키는 첫 번째 필드뿐입니다.

모든 필드 정렬

join -o 2.2,1.2 \
    <(awk '{printf "%s %s\n",$1 $2 $3 $4,$5}' f1) \
    <(zcat f2.gz| awk '{printf "%s %s\n",$1 $2 $4 $5,$3}' )

어디

  • 두 개의 awk파이프를 사용하는 것은 join아마도 좋은 생각이 아닐 것입니다(단, awk유일한 솔루션에 비해 메모리가 절약될 수는 있지만).
  • awk명령은 관련 필드에서 색인을 작성합니다.
  • zcat감압을 위해,
  • 그러면 0질문이 열려 있습니다.

관련 정보