두 파일의 패턴 필드를 일치시키는 grep

두 파일의 패턴 필드를 일치시키는 grep

grep을 사용하여 서로 다른 두 파일의 필드를 일치시킬 수 있습니까? 예를 들어, file1이 있는 경우 두 파일의 POS 필드를 일치시키고 싶습니다. macth가 있으면 일치하는 행만 출력합니다.

1   10366   rs58108140  G   A 
1  51954  rs185832753 G C 

파일 1

#CHROM  POS ID  REF ALT QUAL
1   10366   rs58108140  G   A   
1   10611   rs189107123 C   G   
1   51954   rs185832753 G   C   
1   13327   rs144762171 G   C   
1   13957   .   TC  T   28  
1   13980   rs151276478 T   C   

파일 2

#CHROM  POS ID  REF ALT QUAL    
1   10366   rs58108140  G   A   
1   51935   rs181754315 C   T   
1   51954   rs185832753 G   C   
1   52058   rs62637813  G   C   
1   52144   rs190291950 T   A   
1   52238   rs150021059 T   G   
1   54353   rs140052487 C   A

답변1

grep에서는 그렇게 할 수 없습니다. 패턴을 입력으로 사용하여 파일을 검색할 수 있지만 grep파일에서 특정 필드를 지정할 수는 없습니다. 따라서 두 번째 위치만 일치시키려면 다음과 같은 것이 필요합니다.

$ awk  '{ if(NR==FNR){a[$2]=$0}else{if($2 in a){print}}}' file1.vcf file2.vcf 
#CHROM  POS ID  REF ALT QUAL    
1   10366   rs58108140  G   A   
1   51954   rs185832753 G   C   

물론 위치는 동일하지만 변이가 다른 염색체에 있는 경우도 인쇄됩니다. 이것이 귀하의 질문에서 요구하는 것이지만 chr과 pos의 고유한 조합을 찾는 것이 더 합리적일 수 있습니다.

$ awk  '{ if(NR==FNR){a[$1$2]=$0}else{if($1$2 in a){print}}}' file1.vcf file2.vcf 
#CHROM  POS ID  REF ALT QUAL    
1   10366   rs58108140  G   A   
1   51954   rs185832753 G   C   

이를 수행하려면 grep먼저 POS 필드를 새 파일로 추출해야 합니다.

awk '{print $2}' file1.vcf > file3
$ cat file3
POS
10366
10611
51954
13327
13957
13980

이제 이 파일을 다음 콘텐츠와 함께 사용하세요 grep.

$ grep -f file3 file2.vcf 
#CHROM  POS ID  REF ALT QUAL    
1   10366   rs58108140  G   A   
1   51954   rs185832753 G   C   

그러나 그것은 정말로 좋은 생각이 아닙니다. 예를 들어 1103668 since10366 1103668` is a substring of과 일치하는 항목 도 찾습니다 .


마지막으로 이것이 두 개의 유효한 vcf 파일이라고 가정하면(귀하의 예는 그렇지 않음) bedtools intersect.

답변2

사용 grep:

$ grep -Fof file1 file2
    #CHROM  POS ID  REF ALT QUAL
1   10366   rs58108140  G   A   
1   51954   rs185832753 G   C   
  • -F정규식 대신 고정 문자열 사용
  • -o일치하는 항목만 인쇄
  • -f file1모든 패턴/고정 문자열을 한 줄에 하나씩 검색합니다.file1
  • file2다음에서 파일 검색

대체 용도 awk:

awk '
    NR==FNR{s[$0]=1}
    NR!=FNR && s[$0]
' file1 file2

답변3

"일치" 줄(필드 사이의 공간 크기 포함)의 일부가 두 파일 간에 변경될 수 있다면 join더 나은 도구가 될 것입니다 .

sort -n -k 2 < file1 > sort1
sort -n -k 2 < file2 > sort2
join --header -1 2 -2 2 -o '1.1 1.2 1.3 1.4 1.5'  sort1 sort2

입력을 (공개 필드에서) 정렬해야 하기 때문에 이러한 sort단계가 필요합니다 .join

결과:

#CHROM POS ID REF ALT
1 10366 rs58108140 G A
1 51954 rs185832753 G C

관련 정보