Comparando dos archivos tsv

Comparando dos archivos tsv

Estoy intentando comparar dos archivos tsv. El archivo a consultar (archivo1) tiene el siguiente aspecto:

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

La segunda columna de otro archivo (archivo2) contiene números que deseo verificar, si se encuentran, entre los números de las columnas 2 y 3 en el y repetirlo hasta que se cumpla la condición.

por ejemplo: 242627060se encuentra entre 242627058&242627262

El archivo 2 se parece a:

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

y me da el resultado de la siguiente manera:

chr1:242627058-242627262,  242627060

-de donde provienen las coordenadas separadas file1y la coma separada de la segunda columna de file2.

Ya intenté usar awkel bucle while pero por alguna razón no pude hacerlo.

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 

Respuesta1

Probablemente sea más fácil hacer esto en 2 pasos.

Coloque todo en un archivo auxiliar y ordénelo.

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

Luego simplemente revísalos awken una sola pasada.

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

Un paseo por el awk...... Ya sabes de qué líneas file3vienen file1porque solo tienen 3 campos, file2tiene más....

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

es una prueba que es verdadera cuando estás en una línea (en file3) que proviene de file1. Cada vez que encuentre una línea a partir de file1ese momento, querrá obtener los valores loy hi, así como el cromosoma actual.

else  

De lo contrario, estamos en una línea file2tan justa.....

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

Y si estamos en el mismo cromosoma y el valor de interés $2está entre los límites loy hique recordamos antes, imprimimos en su formato.

La salida fue

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

nota

De hecho puedes olvidar el primero awky el justo.

cat file1 file2 | sort > file3

Y dado que ordena toda la línea, debería ser chragnóstico.

Respuesta2

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

Más adelante podrás eliminar el echo "Comprobando $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 ..

información relacionada