Comparando dois arquivos tsv

Comparando dois arquivos tsv

Estou tentando comparar dois arquivos tsv. O arquivo a ser consultado (arquivo1) se parece com:

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

A segunda coluna de outro arquivo (arquivo2) contém números que desejo verificar, se estiverem, entre os números das colunas 2 e 3 no e repita até que a condição seja satisfeita.

por exemplo: 242627060fica entre 242627058&242627262

O arquivo2 se parece com:

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      .   -

e me dá a seguinte saída:

chr1:242627058-242627262,  242627060

de onde são as -coordenadas separadas file1e a vírgula separada da segunda coluna de file2.

Já tentei usar awko loop while, mas por algum motivo não consegui.

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 

Responder1

Provavelmente mais fácil fazer isso em 2 etapas.

Jogue tudo em um arquivo auxiliar e classifique.

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

Em seguida, basta percorrê-los awkem uma única passagem.

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

Um passeio pelo awk...... Você sabe de quais linhas file3vieram file1porque elas só têm 3 campos, file2tem mais....

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

é um teste que é verdadeiro quando você está em uma linha (in file3) que veio de file1. Cada vez que você encontra uma linha a partir de file1então, deseja obter os valores loe hi, bem como o cromossomo atual

else  

Caso contrário, estaremos em uma linha file2tão apenas.....

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

E se estivermos no mesmo cromossomo e o valor de interesse $2estiver entre os limites loe hique lembramos antes, então imprimimos no seu formato.

A saída foi

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

observação

Na verdade você pode esquecer o primeiro awke apenas

cat file1 file2 | sort > file3

E como classifica toda a linha, deve ser chragnóstico.

Responder2

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

Mais tarde você pode remover echo "Checking $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 ..

informação relacionada