Awk: удалить дубликаты строк с условиями - PullRequest
1 голос
/ 30 сентября 2011

У меня есть текстовый файл с разделителями табуляции с 8 столбцами:

Erythropoietin Receptor Integrin Beta 4 11.7    9.7 164 195 19  3.2
Erythropoietin Receptor Receptor Tyrosine Phosphatase F 10.8    2.6 97  107 15  3.2
Erythropoietin Receptor Leukemia Inhibitory Factor Receptor 12.0    3.6 171 479 14  3.2
Erythropoietin Receptor Immunoglobulin 9    10.4    3.1 100 108 24  3.3
Erythropoietin Receptor Collagen Alpha 1 Xx 10.7    2.7 93  105 18  3.3
Tumor Necrosis Factor Receptor  Tumor Necrosis Factor Receptor 5    11.4    3.2 114 114 25  1.7
Tumor Necrosis Factor Receptor  Tumor Necrosis Factor Receptor 14   11.1    2.1 99  100 28  1.8
Tumor Necrosis Factor Receptor  Tumor Necrosis Factor Receptor 1B   10.9    4.9 133 162 29  1.9
Tumor Necrosis Factor Receptor  Tumor Necrosis Factor Receptor 11A  11.5    5.1 130 166 25  1.9

Первый и второй столбцы содержат названия белков, а 8-й столбец содержит оценку «расстояния» между каждой парой белков.Я хотел бы удалить строки, содержащие дублирующиеся пары белков, и оставить только пару с наименьшим расстоянием (самое низкое значение в 8-м столбце).Это означает, что для пары Protein A-Protein BI хотелось бы удалить все вхождения, кроме случая с наименьшей дистанцией.Пара считается дубликатом, даже если имена белков поменялись местами (в разных столбцах).Это означает, что Протеин А Протеин В такой же, как Протеин В Протеин А.

Ответы [ 2 ]

3 голосов
/ 30 сентября 2011

Примерно так (не проверено):

awk -F'\t' 'END {
  for (r in rec) print rec[r] 
  }
{
  if (mina[$1, $2] < $NF || minb[$2, $1] < $NF) {
    mina[$1, $2] = $NF; minb[$2, $1] = $NF
    rec[$1, $2] = $0
    }  
  }' infile
1 голос
/ 30 сентября 2011

Надеюсь, это будет окончательное обновление ^ _ ^

kent$  awk -F'\t' '{if($1$2 in a){
                if($8<a[$1$2]){
                        a[$1$2]=$8;r[$1$2]=$0;
                }
        }else if ($2$1 in a){
                if($8<a[$2$1]){
                        a[$2$1] = $8;r[$2$1] = $0;
                }
        }else{
                a[$1$2]=$8; r[$1$2]=$0;
        }
} END{for(x in r)print r[x]}' yourFile
...