두 개의 TSV 파일 비교

두 개의 TSV 파일 비교

두 개의 tsv 파일을 비교하려고합니다. 쿼리할 파일(file1)은 다음과 같습니다.

Chr      Start      End
chr1    234738546   234738934
chr1    234792654   234793537
chr1    234908151   234908864
chr1    235097868   235098170
chr1    236080566   236081347
chr1    240307621   240308262
chr1    240308207   240308637
chr1    240308546   240308962
chr1    242627058   242627262
chr1    243923195   243923709

다른 파일(file2)의 두 번째 열에는 열 2와 3의 숫자 사이에 거짓말이 있는지 확인하고 조건이 만족될 때까지 반복하고 싶은 숫자가 포함되어 있습니다.

예: & 242627060사이에 위치242627058242627262

File2는 다음과 같습니다.

Chr    Centre_Coord Ignore_this_col   Secondary Information
chr1    234765055   234765056   NR_033927_LINC00184     .   +
chr1    234782033   234782034   NR_125944_LOC101927787  .   +
chr1    234859787   234859788   NR_038856_LINC01132     .   +
chr1    234895802   234895803   NR_148962_PP2672        .   -
chr1    235099745   235099746   NR_125945_LOC101927851  .   -
chr1    235324564   235324565   NR_144491_RBM34         .   -
chr1    235097888   235291252   NR_002956_SNORA14B      .   -
chr1    235097869   235353431   NR_039908_MIR4753       .   -
chr1    235324564   235324565   NR_027762_RBM34         .   -
chr1    235324564   235324565   NM_001346738_RBM34      .   -

다음과 같이 출력됩니다.

chr1:242627058-242627262,  242627060

여기서 분리된 좌표 는 의 두 번째 열에서 분리된 쉼표 -입니다 .file1file2

나는 이미 while 루프를 사용해 보았지만 awk어떤 이유로든 할 수 없었습니다.

while read a b c; do col2=$b; col3=$3; tail -n +1 path/to/file2 | awk 'BEGIN{OFS="\t"}{if($2>=$col2 && $2<=$col3) {print $a,$col2,$col3,$2}; break; else continue}' > rohit_TSS.txt; done < file1 

답변1

아마도 2단계로 수행하는 것이 더 쉬울 것입니다.

모든 것을 도우미 파일에 넣고 정렬하세요.

awk 'FNR>1{print $1, $2, $3, $4 }' file1 file2 | sort -k1 >> file3

awk그런 다음 한 번의 패스 로 실행해 보세요 .

awk '{if (NF == 3) {chr=$1; lo=$2; hi=$3} else { if ($1==chr && $2>=lo && $2<=hi) print $1":"lo"-"hi", "$2}}' file3

을 산책해 보세요 . 3개의 필드만 있고 더 많은 라인이 있기 때문에 어느 라인 에서 왔는지 awk알 수 있습니다 ....file3file1file2

if (NF == 3) {chr=$1; lo=$2; hi=$3}

file3는 에서 온 라인(in)에 있을 때 참인 테스트입니다 file1. 그때 부터 라인을 찾을 때마다 현재 염색체뿐만 아니라 값도 얻고 file1싶습니다.lohi

else  

그렇지 않으면 우리는 그렇게 막다른 골목에 있습니다 file2.....

 if ($1==chr && $2>=lo && $2<=hi) print $1":"lo"-"hi", "$2}

그리고 우리가 동일한 염색체에 있고 관심 값이 이전에 기억했던 한계 와 한계 $2사이에 있다면 우리는 귀하의 형식으로 인쇄합니다.lohi

출력은

chr1:235097868-235098170, 235097869
chr1:235097868-235098170, 235097888

메모

사실 당신은 첫 번째 awk와 마지막을 잊어버릴 수 있습니다

cat file1 file2 | sort > file3

그리고 전체 라인을 기준으로 정렬되므로 chr불가지론적이어야 합니다.

답변2

for C in `cat file2 |awk -F" " '{ print $2 }' ` ; do 
   echo "Checking $C .." ;
   cat file1 | awk -v var=$C -F" " '{ if ( var  >=$2 && var <=$3 ) print $1":"$2"-"$3", "var  ;  }'; 
done

나중에 echo "$C .. 확인 중"을 제거할 수 있습니다.

Checking 234765055 ..
Checking 234782033 ..
Checking 234859787 ..
Checking 234895802 ..
Checking 235099745 ..
Checking 235324564 ..
Checking 235097888 ..
chr1:235097868-235098170, 235097888
Checking 235097869 ..
chr1:235097868-235098170, 235097869
Checking 235324564 ..
Checking 235324564 ..

관련 정보