awk 두 개의 키 열을 기반으로 두 개의 파일을 연결합니다.

awk 두 개의 키 열을 기반으로 두 개의 파일을 연결합니다.

나는 두 개의 주요 열(염색체와 위치)을 기반으로 두 개의 큰 파일을 병합하려고 시도했는데 내가 찾은 가장 효율적인 방법은 awk.

내 파일의 예는 다음과 같습니다.

file1.txt
Gene_ID Chromosome Position Fst
ENSG00000141424 18 33688658 0
ENSG00000141424 18 33688669 0
ENSG00000141424 18 33688681 0
ENSG00000141424 18 33688683 0.0111734
ENSG00000141424 18 33688720 0
ENSG00000141424 18 33688726 0
ENSG00000141424 18 33688743 0
ENSG00000141424 18 33688745 0
ENSG00000141424 18 33688763 0

다른 파일:

file2.txt
Chromosome Start End Ref Alt RS_ID
1   10019   10020   TA  T   rs775809821
1   10020   10020   A   -   rs775809821
1   10055   10055   -   A   rs768019142
1   10055   10055   T   TA  rs768019142
1   10108   10108   C   T   rs62651026
1   10109   10109   A   T   rs376007522
1   10128   10128   A   AC  rs796688738
1   10128   10128   -   C   rs796688738
1   10139   10139   A   T   rs368469931
1   10144   10145   TA  T   rs144773400

나는 다음과 같은 세 번째 파일을 원합니다.

Gene_ID Chromosome Position RS_ID Fst
ENSG00000141424 18 33688658 rs1504554... 0

을 사용해 보았는데 구문은 괜찮다고 생각하지만 내가 얻는 것은 포함 되고 연결된 awk파일뿐입니다 .file1.txtfile2.txt

awk  'FS=" "; OFS=" ";NR=FNR{A[$1,$2]=$6;next}{$5=A[$2,$3];print}' file1.txt file2.txt > file3.txt

내가 뭘 잘못하고 있는지에 대한 아이디어가 있습니까?

답변1

코드를 몇 가지 수정하면 문제가 해결됩니다.

awk 'NR==FNR{A[$1,$2]=$6;next}{$5=A[$2,$3];if($5!="")print}' file2.txt file1.txt
  • NR==FNR그리고 of는 NR=FNRawk가 첫 번째 파일을 실행할 때의 조건입니다.file2.txt
  • 두 번째 실행에서 NR!=FNR조인 키가 있으면 다음 줄을 인쇄합니다.A
  • awk의 기본 필드 구분 기호는 이미 공백이므로 여기서 지정할 필요가 없습니다.

관련 정보