фильтрация с использованием awk split - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть текстовый файл следующего формата

build:chr:pos sample_1 sample_2 ...
38:1:189665   1        1
38:1:416546   0        0        ...
38:1:9000     0        1        ...
...           ...      ...      ...

Я пытаюсь отфильтровать его по положению каждого элемента в первом столбце.Мой мыслительный процесс заключается в том, что с помощью split в awk я могу получить подстроку, содержащую pos, и отфильтровать ее по заданному порогу.Это мой оператор awk в настоящее время

awk -v upper_bound=100000 -v lower_bound=100 
'{
   split($1,a,":");
   if (a[3] < upper_bound && a[3] >= lower_bound) 
      print $0
}'

, и в настоящее время он производит пустой вывод.Он должен распечатать все эти позиции с pos между 100-100000.Я полагаю, что проблема находится в моем условном утверждении, поскольку, когда это удалено, это успешно печатает.Кто-нибудь может посоветовать, что не так?

Редактировать: опубликовал плохой пример, у меня действительно есть предметы, которые должны пройти фильтрацию, но это не так.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Упрощенная команда awk с использованием нескольких разделителей (пробел и двоеточие):

awk -F"[: ]" -v lower_bound=100 -v upper_bound=100000 'lower_bound<=$3 && $3<=upper_bound' filename
0 голосов
/ 05 декабря 2018

Как уже упомянул в своих комментариях dwag, что показанные вами образцы НЕ имеют какой-либо линии, которая удовлетворяет вашим условиям, поэтому вы НЕ видите ничего в выводе.Я также исправил 2 вещи (1-е: '{ место для awk первого блока и 2-е: {} добавлено для if условия для более безопасной стороны).

Я также проверил ваш код (после применения небольших изменений, упомянутых выше), с еще одной строкой, как показано ниже, скажем, следующим является Input_file.

cat Input_file
build:chr:pos sample_1 sample_2 ...
38:1:189665   1        1
38:1:416546   0        0        ...
39:1:9999     1        2        ...
...           ...      ...      ...

Теперь, когда я запускаю следующий код, он выдает следующий вывод:

awk -v upper_bound=100000 -v lower_bound=100 '{
   split($1,a,":");
   if (a[3] < upper_bound && a[3] >= lower_bound){
      print $0}
}'  file82836752
39:1:9999     1        2        ...

РЕДАКТИРОВАТЬ: Еще 1 мысль, проверьте cat -v Input_file для вашего Input_file, если в случае, если он имеет символы CONTROL M, если да, то попробуйте удалить их, выполнив также tr -d '\r' < Input_file > temp_file && mv temp_file Input_file.Просто еще одна мысль, если это тоже может быть проблемой.

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