공통 열을 기준으로 두 파일을 병합합니다. 파일 2에 존재하지 않는 변형에 대해 0을 추가하고 존재하는 변형에 원래 값을 유지합니다.

공통 열을 기준으로 두 파일을 병합합니다. 파일 2에 존재하지 않는 변형에 대해 0을 추가하고 존재하는 변형에 원래 값을 유지합니다.

공통 데이터를 공유하는 두 개의 파일을 병합하고 싶습니다. File1에는 여러 개의 파일이 포함되어 있습니다2. 공유컬럼(3)을 기준으로 파일1을 기준으로 파일을 병합하고 싶은데, 파일2에 변수가 없을 경우 5번째 컬럼(AN1)에 0을 추가하고, 존재한다면, AN1의 원래 값(0 또는 1)을 추가합니다.

내 파일은 다음과 같습니다: 파일 1

CHR BP  SNP CM  base
20  61098   rs6078030   -0.00024510777  1
20  61795   rs4814683   0   1
20  63231   rs6076506   0.0005026053    1
20  63244   rs6139074   0.00050714752   1

파일 2

CHR BP  SNP CM  AN1
20 9836704 rs221007 0 1
20 9817032 rs221011 0 0
20 9764069 rs2206484 0 0
20 9639395 rs4816159 0 1

열 3(SNP)을 기준으로 일치시키고 싶습니다. 지금은 다른 모든 열을 유지하고 싶습니다.

내가 원하는 출력은 다음과 같습니다(rsX가 없거나 AN1의 원래 값이 0인 경우 0).

파일 3

CHR BP  SNP CM  base AN1
20  61098   rs6078030   -0.00024510777  1   1
20  61795   rs4814683   0   1   0
20  63231   rs6076506   0.0005026053    1   0
20  63244   rs6139074   0.00050714752   1   1

새로운 상황에 따라 이 코드를 수정해야 합니다.

awk 'NR==FNR{ snp[$3]; next }
{ $6=($3 in snp)?(FNR==1?"AN1":"1"):"0" }1' file2 file1

여기서는 파일 1에 rsX가 있으면 1을 인쇄합니다. AN1의 원래 값(0 또는 1)을 인쇄하고 싶습니다.

답변1

awk 'NR==FNR{ snp[$3]=$NF; next }
{ $6=($3 in snp)?(FNR==1?"AN1":snp[$3]):"0" }1' file2 file1

문제는 다음과 같습니다 awk.

NR: 지금까지 본 총 입력 레코드 수입니다.
FNR: 다음 입력 파일에서는 현재 입력 파일의 입력 레코드 번호가 1로 재설정됩니다.

따라서 첫 번째 입력 파일에 대해서만 조건이 항상 true이고 조건이 true이면 NR==FNR다음 블록이 실행되고 마지막 열 값을NR==FNR { ... }$NF열로 키가 지정된 배열 snp입니다.$3

next상태 이유나머지 코드 실행을 건너뛰고 다시 시작합니다. NF==FNR여전히 true인 경우 첫 번째 입력 파일의 모든 레코드/줄을 읽을 때까지 블록을 반복적으로 처리합니다.

$6그런 다음 다음 블록에서는 다음 조건을 사용하여 열 값을 추가/업데이트합니다.

  • snpfile1의 열 3 이 file2의 배열 에 설정된 경우 다음을 수행합니다.
    • 첫 번째 행인 경우 해당 값을 다음으로 설정합니다.AN1
    • 첫 번째 행이 아닌 경우 값을 다음부터 시작하도록 설정합니다.snp[$3]대량으로.
  • 그렇지 않으면 다음으로 설정됩니다.0.

이것에돔1결국 결과를 인쇄하는 데 사용됩니다.

관련 정보