Вы можете разбить строку в выбранном вами поле и проверить, больше ли значение элемента c элемента сразу после разбиения, чем ваш порог.
Более подробно, разбив вход yes,foo=2,bar=0.23,baz=1
на ,bar=
даст массив, содержащий yes,foo=2
и 0.23,baz=1
. В Awk, если вы сравните второй элемент с 0.2
, он будет просто конвертировать столько, сколько может из начала значения, в число, а затем выполнить сравнение чисел c.
Таким образом
awk '{ split($0, x, /[\t;]AMR_AF=/) } x[2]>0.5' file.vcf
должен делать то, что вы хотите. Мы разбиваем строку на x
и исследуем значение чисел c, равное x[2]
.
. [\t;]
в регулярном выражении допускает либо табуляцию, либо точку с запятой перед именем поля; чтобы быть совершенно общим, возможно, вам даже следует использовать (^|[\t;])
, чтобы также разрешить совпадение в начале строки.
Если вы хотите параметризовать это, возможно, попробуйте
awk -v field="AMR_AF" -v thres=0.5 '{ split($0, x, "(^|[\t;])" field "=")) } x[2]>thres' file.vcf
Recall что Awk обрабатывает скрипт для каждой строки ввода сверху вниз, где каждый оператор скрипта имеет форму
[ условие ] [{
action }
]
Как показывают квадратные скобки, обе части являются необязательными - если условие отсутствует, действие выполняется безоговорочно; если действие отсутствует, по умолчанию используется { print $0 }
. Таким образом, наш скрипт сначала безоговорочно разделит строку, а затем условно напечатает ее, если x[2]
больше порога.
GNU Awk может разбивать многосимвольный разделитель полей, поэтому вы также можете использовать -F '[\t;]AMR_AF='
.
awk -F '[\t;]AMR_AF=' '$2>0.5' file.vcf