Как использовать awk только для печати совпадений с минимальным значением в определенном поле? - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь проанализировать некоторые результаты, предоставленные HMMER, и в файле tblout мне удалось выделить нужные совпадения.

Тем не менее, одно и то же значение повторяется несколько раз, если оно совпадает только с однимprofile.

Например, это одно чтение повторяется 3 раза:

SRR6033660.161030 FAM007172 4e-15 4.2e-15 63.4 63.4
SRR6033660.1458607 FAM019859 2.5e-12 2.7e-12 55.0 54.9
SRR6033660.1458607 FAM015326 4e-14 4.2e-14 58.8 58.7
SRR6033660.1458607 FAM000764 7.5e-25 8.1e-25 94.6 94.5

Это соответствует 3 семействам, тем не менее, я просто хочу выбрать строку с самыми низкими значениями e(3-й и 4-й столбцы)

Как мне написать команду awk, которая выдаст мне этот вывод?

SRR6033660.161030 FAM007172 4e-15 4.2e-15 63.4 63.4
SRR6033660.1458607 FAM000764 7.5e-25 8.1e-25 94.6 94.5

Спасибо!

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Суммирует $3 и $4, а тот, у которого наименьшая сумма , имеет самые низкие электронные значения (при отсутствии лучшего определения):

$ awk '
# $3+$4==s[$1] {            # this commented out part appends records when
#    r[$1]=r[$1] ORS $0     # the sum of $3+$4 is equally small with the 
# }                         # smallest so far
$3+$4<s[$1] || s[$1]=="" {  # if the sum of $3+$4 is the smallest or first
    s[$1]=$3+$4             # store the sum
    r[$1]=$0                # and record
}
END {                       # after all records are processed
    for(i in r)             # loop thru stored records
        print r[i]          # and output them
}' file
SRR6033660.1458607 FAM000764 7.5e-25 8.1e-25 94.6 94.5
SRR6033660.161030 FAM007172 4e-15 4.2e-15 63.4 63.4

Если вы раскомментируете первый блок, скрипт выведет все записи с наименьшим значением $3+$4, например: awk {script} file file выведет:

SRR6033660.1458607 FAM000764 7.5e-25 8.1e-25 94.6 94.5
SRR6033660.1458607 FAM000764 7.5e-25 8.1e-25 94.6 94.5
SRR6033660.161030 FAM007172 4e-15 4.2e-15 63.4 63.4
SRR6033660.161030 FAM007172 4e-15 4.2e-15 63.4 63.4
0 голосов
/ 11 февраля 2019

Другие люди предоставили чистые решения awk.Обратите внимание, что они включают в себя загрузку практически всего содержимого данных в память.В общем случае это проблематично.

Оказывается, что сортировка (в частности версия GNU coreutils, не уверенная в других) достаточно умна, чтобы использовать временные файлы при работе с большими объемами данных.Он также может сравнивать числа, указанные в плавающей запятой.

Итак:

LC_NUMERIC=C sort <TBLOUT -k1 -k3g -k4g | awk 't!=$1{t=$1;print}'
  • сначала отсортируйте входные данные так, чтобы строки были сгруппированы по первому столбцу, а затем упорядочены по числовому значению по столбцу 3.и 4
  • LC_NUMERIC=C гарантирует, что мы будем правильно сортировать в локалях, где числа написаны, например, 1,234,56, а не 1,234,56
  • мы можем переключаться вокруг -k3g и -k4g если 4-йстолбец более важен
  • простой способ объединения / взвешивания столбцов 3 и 4 (но мы могли бы предварительно обработать каждую строку для получения нового столбца - возможно, передать через другой awk до сортировки)
  • pipeрезультат в awk - выводить только те строки, где первый столбец изменился
0 голосов
/ 07 февраля 2019

выбор минимума по двум полям вообще не будет работать, здесь я предлагаю линейную комбинацию, в которой вы можете установить вес.

$ awk -v a=0.5 '{c=a*$3+(1-a)*$4}
        !($1 in min) || c<min[$1]{min[$1]=c; minLine[$1]=$0}
         END{for(k in minLine) print minLine[k]}' file | column -t

SRR6033660.1458607  FAM000764  7.5e-25  8.1e-25  94.6  94.5
SRR6033660.161030   FAM007172  4e-15    4.2e-15  63.4  63.4

из-за хеширования, порядок записей не сохраняется,Вы можете добавить порядковый номер и сортировать на основе этого впоследствии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...