Awk filtro condicional un archivo basado en otro (u otras soluciones)
El principiante de programación aquí necesita ayuda para modificar un script AWK para que sea condicional. Soluciones alternativas no-awk también son muy bienvenidas.
NOTA El filtro principal ahora está funcionando gracias a la ayuda de Birei, pero tengo un problema adicional, vea la nota a continuación para obtener detalles.
Tengo una serie de archivos de entrada con 3 columnas así:
chr4 190499999 190999999
chr6 61999999 62499999
chr1 145499999 145999999
Quiero usar estas filas para filtrar otro archivo (refGene.txt) y si una fila en el archivo uno calcula una fila en refGene.txt, para enviar la columna 13 en refGene.txt a un nuevo archivo 'ListofGenes_ $ f'. La parte difícil para mí es que quiero que cuente como una coincidencia, siempre y cuando la columna uno (por ejemplo, 'chr4', 'chr6', 'chr1') y la columna 2 Y / O la columna 3 coincida con las columnas equivalentes en el gen ref. archivo txt Las columnas equivalentes entre los dos archivos son $ 1 = $ 3, $ 2 = $ 5, $ 3 = $ 6. Entonces no estoy seguro en awk cómo no imprimir toda la fila desde refGene.txt pero solo la columna 13.
NOTA He logrado el filtrado condicional descrito anteriormente gracias a la ayuda de Birei. Ahora necesito incorporar una condición de filtro adicional. También debo generar la columna $ 13 del archivo refGene.txt si alguna de las regiones entre el valor $ 2 y $ 3 se superpone con la región entre $ 5 y $ 6 en el archivo refGene.txt. Esto parece mucho más complicado ya que involucra el cálculo matemático para ver si las regiones se superponen.
Mi guión hasta ahora:
FILES=/files/*txt
for f in $FILES ;
do
awk '
BEGIN {
FS = "\t";
}
FILENAME == ARGV[1] {
pair[ $1, $2, $3 ] = 1;
next;
}
{
if ( pair[ $3, $5, $6 ] == 1 ) {
print $13;
}
}
' $(basename $f) /files/refGene.txt > /files/results/$(basename $f) ;
done
Cualquier ayuda es muy apreciada. ¡Muchas gracias!
Rubal