Bash는 두 열을 "결합"합니다.

Bash는 두 열을 "결합"합니다.

두 개의 파일이 있습니다.

1_file.txt:
ChrX 129759713 A G
ChrX 129760010 C T
ChrX 129762238 C G
ChrX 129762448 A G
ChrX 129762803 A C
ChrX 129763441 C A
ChrX 129764931 T C
ChrX 129767696 C T
ChrX 129818213 C T
ChrX 129841336 T C

2_files.txt:
Chr29 129841336 T C
Chr29 129845233 A G
Chr29 129852688 T C
Chr29 129871602 G T
Chr29 129872683 T C
ChrX 129875545 C A
ChrX 129876975 A G
ChrX 129879796 G A
ChrX 129880521 T C
ChrX 129759713 A G
ChrX 129760010 C T
ChrX 129762238 C G
ChrX 129762448 A G
ChrX 129762803 A C
ChrX 129763441 C A

두 개의 파일을 필드 1과 2로 하나로 병합하고 싶습니다.

The answer
ChrX 129759713 A G
ChrX 129760010 C T
ChrX 129762238 C G
ChrX 129762448 A G
ChrX 129762803 A C
ChrX 129763441 C A

Join 또는 awk를 사용하여 이를 수행하는 방법에 대한 아이디어가 있습니까?

답변1

두 번째 파일에서 누락된 줄이 있습니까? "TG" 또는 "AT"가 있는 항목은 표시되지 않습니다. 내가 아는 한 join두 필드는 허용되지 않으며 sed를 사용하여 두 필드를 연결할 수 있습니다. 구체적인 예에 ​​대한 예는 다음과 같습니다.

join -j 1 <(cat 1_file.txt | sed "s/ /_/") <(cat 2_files.txt | sed "s/ /_/")

답변2

awk를 사용하면 사용할 수 있습니다

awk '
    NR == FNR          {f1[$1,$2] = $0; next}
    $1 SUBSEP $2 in f1 {print f1[$1,$2], $3, $4}
' 1_file.txt 2_files.txt
ChrX 129759713 A G A G
ChrX 129760010 C T C T
ChrX 129762238 C G C G
ChrX 129762448 A G A G
ChrX 129762803 A C A C
ChrX 129763441 C A C A

awk 구문과 작동 방식에 대한 자세한 내용은 다음을 참조하세요.스택 오버플로의 awk 정보 페이지

여기:

  • NR == FNR이 조건은 처리 중인 첫 번째 파일의 행에만 적용됩니다. 이 블록에서는 처음 2개의 필드를 키로 사용하여 각 행을 배열에 저장합니다. 바라보다초보자 매뉴얼변수의 의미를 이해합니다.
  • 배열 키에서 쉼표를 사용하여 내장 SUBSEP 변수(인용하다)
  • $1 SUBSEP $2 in f1두 번째 파일의 행에 대해 첫 번째 및 두 번째 필드가 첫 번째 파일에도 나타나면 조건은 true입니다.

관련 정보