Entonces, tengo el siguiente archivo tabulado con mil filas:

NP_000007.1     ACADM   1457    rs1061337       not_match
NP_000007.1     ACADM   2761    rs2229249       not_match
NP_000007.1     ACADM   2761    rs2229249       not_match
NP_000019.2     AGL     1094    rs1042090       1398
NP_000019.2     AGL     1094    rs1042090       1395
NP_000057.1     C8B     1078    rs1013579       117
NP_000057.1     C8B     932     rs856847        345
NP_000057.1     C8B     932     rs856831        not_match
NP_000057.1     C8B     932     rs856841        429
NP_000076.2     CLCNKB  48      rs5251          334

Me gustaría eliminar esas filas para cada grupo de cadenas agrupadas en la primera columna si al menos aparece el patrón not_match una vez en la quinta columna. Por lo tanto, solo se imprimen las filas agrupadas por la misma cadena en la primera columna que corresponden solo a los números en la quinta columna.

El resultado deseado sería:

NP_000019.2     AGL     1094    rs1042090       1398
NP_000019.2     AGL     1094    rs1042090       1395
NP_000076.2     CLCNKB  48      rs5251          334

Pienso hacerlo en algunos pasos separando las filas con el patrón "not_match" y los números en la quinta columna y luego ver si hay coincidencias en la primera columna mediante un hash y descartar estas coincidencias. Sin embargo, me gustaría hacerlo en un solo paso en el mismo archivo. ¿Cómo puedo conseguirlo en un entorno Unix? Gracias por adelantado

0
Perceval Vellosillo Gonzalez 15 nov. 2017 a las 20:53

2 respuestas

La mejor respuesta

¡awk al rescate!

Un algoritmo de dos pasos será el más simple

$ awk 'NR==FNR {                       # in the first round 
         if($NF=="not_match") a[$1];   # record the keys to be deleted
         next}                         #
       !($1 in a)' file{,}             # in the second round skip them

Tenga en cuenta que file{,} es la abreviatura de file file

NP_000019.2     AGL     1094    rs1042090       1398
NP_000019.2     AGL     1094    rs1042090       1395
NP_000076.2     CLCNKB  48      rs5251          334
3
karakfa 15 nov. 2017 a las 18:08

Solución alternativa sort + awk :

sort -k1,1 -k5,5r file | awk '!($1 in a){ a[$1]=$5 }a[$1]!="not_match"'

La salida:

NP_000019.2     AGL     1094    rs1042090       1398
NP_000019.2     AGL     1094    rs1042090       1395
NP_000076.2     CLCNKB  48      rs5251          334
1
RomanPerekhrest 15 nov. 2017 a las 18:39