
표 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
질문이 열려 있습니다.