2017-11-29 4 views
1

두 파일을 비교하고 각기 다른 열을 결합하려고합니다.awk로 반복적 인 잡기

1.txt 
chr8 12 24 . . + chr1 11 12 XX4 - 
chr3 22 33 . . + chr4 60 61 XXX9 - 


2.txt 
chr1 11 1 X1 X2 11 12 2.443 0.843 +1 SXSD 1.3020000 
chr1 11 2 X3 X4 11 12 0.888 0.833 -1 XXSD -28.887787 
chr1 11 3 X5 X6 11 12 0.888 0.843 +1 XXSD 2.4909883 
chr1 12 4 X7 X8 11 12 0.888 0.813 -1 CMKY 0.0009223 
chr1 12 5 X9 X10 11 12 0.888 0.010 -1 XASD 0.0009223 
chr1 12 6 X11 X12 11 12 0.888 0.813 -1 XUPS 0.10176998 

내가 1.txt7th, 8th9th 열이, 2.txt1st,6th7th 열을 비교하고자하고, 일치하는 경우, 나는 1.txt의 전체 라인을 인쇄 할 : 예제 파일은 2.txt.

3th12th 열로 예상 출력은 다음

chr8 12 24 . . + chr1 11 12 XX4 - 1 1.3020000 
chr8 12 24 . . + chr1 11 12 XX4 - 2 -28.887787 
chr8 12 24 . . + chr1 11 12 XX4 - 3 2.4909883 
chr8 12 24 . . + chr1 11 12 XX4 - 4 0.0009223 
chr8 12 24 . . + chr1 11 12 XX4 - 5 0.0009223 
chr8 12 24 . . + chr1 11 12 XX4 - 6 0.10176998 
,745

chr8 12 24 . . + chr1 11 12 XX4 - 6 0.10176998 

가 어떻게 반복적으로 검색 할 수 있습니다 및 인쇄 모든 일치 :

내 재판 awk:

awk 'NR==FNR{ a[$1,$6,$7]=$3"\t"$12; next } { s=SUBSEP; k=$7 s $8 s $9 }k in a{ print $0,a[k] }' 2.txt 1.txt 

그것은 마지막 경기를 출력하고, 나는 그것이 모든 일치를 인쇄 할 수 없습니다 함께?

답변

1

확장 AWK 용액 :

awk 'NR==FNR{ s=SUBSEP; k=$1 s $6 s $7; a[k]=(k in a? a[k]"@":"")$3"\t"$12; next } 
    { s=SUBSEP; k=$7 s $8 s $9 } 
    k in a{ len=split(a[k], b, "@"); for (i=1;i<=len;i++) print $0,b[i] }' 2.txt 1.txt 
  • s=SUBSEP; k=$1 s $6 s $7 - 맞춤 세퍼레이터와 $3"\t"$12 서열을 연결 - 1, HTE 파일 6,7 필드 2.txt
  • a[k]=(k in a? a[k]"@":"")$3"\t"$12 구성된 키 k 값 건설 같은 그룹 내의 @ (그룹은 k로 표시)
  • 01 23,516,
  • s=SUBSEP; k=$7 s $8 s $9 - 7, 8 및 파일 9 필드 1.txt
  • len=split(a[k], b, "@"); 구성된 키 k 값 구축 - 분리기 배열 b에 미리 축적 시퀀스를 분할 @

출력을 :

chr8 12 24 . . + chr1 11 12 XX4 - 1 1.3020000 
chr8 12 24 . . + chr1 11 12 XX4 - 2 -28.887787 
chr8 12 24 . . + chr1 11 12 XX4 - 3 2.4909883 
chr8 12 24 . . + chr1 11 12 XX4 - 4 0.0009223 
chr8 12 24 . . + chr1 11 12 XX4 - 5 0.0009223 
chr8 12 24 . . + chr1 11 12 XX4 - 6 0.10176998 
+0

감사합니다. 모든 도움을 주셔서 감사합니다. 조금만 설명해 주시겠습니까? – bapors

+0

@bapors, 환영합니다, 내 설명 참조 – RomanPerekhrest

2

2n을 읽으면 훨씬 더 어려워집니다. d 파일을 먼저 작성하십시오.

$ cat tst.awk 
NR==FNR { a[$7,$8,$9] = $0; next } 
($1,$6,$7) in a { print a[$1,$6,$7], $3, $12 } 

$ awk -f tst.awk 1.txt 2.txt 
chr8 12 24 . . + chr1 11 12 XX4 - 1 1.3020000 
chr8 12 24 . . + chr1 11 12 XX4 - 2 -28.887787 
chr8 12 24 . . + chr1 11 12 XX4 - 3 2.4909883 
chr8 12 24 . . + chr1 11 12 XX4 - 4 0.0009223 
chr8 12 24 . . + chr1 11 12 XX4 - 5 0.0009223 
chr8 12 24 . . + chr1 11 12 XX4 - 6 0.10176998 
+1

와우! 그것은 대단한 방법입니다. 고맙습니다. – bapors

+1

주목! 고맙습니다 – bapors