Ошибки при передаче переменной в awk - PullRequest
1 голос
/ 17 января 2012

Я пытаюсь передать внешнюю переменную в awk, используя awk -v, но просто не могу понять, в чем моя проблема!

for ((c=1;c<=22;c++));do cat hg19.gap.bed|awk -v var={chr"$c"} '{if ("$1"=="$var") print}' > $var.cbs;done

В чем проблема этой команды?ТНХ

Ответы [ 3 ]

3 голосов
/ 17 января 2012

В awk только переменные поля начинаются с $. И вам не нужны двойные кавычки в awk. Попробуйте if ($1 == var) ....

Использование $var фактически означает поле с индексом, хранящимся в var, в данном случае это недопустимое поле (но вы можете использовать его для перебора полей).

1 голос
/ 17 января 2012

Что должен произвести var={chr"$c"}?

В этом контексте он производит {chr1}, {chr2}, ..., {chr22}.

Обратите внимание, что переменная var является переменной awk, а не переменной оболочки. Вам нужно перенаправить на "{chr$c}.cbs", чтобы получить 22 отдельных файла. Внутри скрипта $var всегда будет $0, поскольку var оценивается как число 0.

Вместо того, чтобы выполнить команду 22 раза, вы, безусловно, можете сделать все это за один проход. Предполагая, что вы используете gawk (GNU Awk) или awk на MacOS X (BSD) или любой POSIX-совместимый awk, вы можете написать:

awk '$1 ~ /\{chr([1-9]|1[0-9]|2[012])\}/ {file=$1".cbs"; print $0 >file;}' hg19.gap.bed

Это делает всю работу за один проход через файл данных.

0 голосов
/ 17 января 2012

Я предполагаю, что chr - это просто некоторая строка, и вы хотите сопоставить ее с chr1, chr2, ....

for ((c=1;c<=22;c++));do cat hg19.gap.bed | awk -v var=chr"$c" '"$1"==var {print}' > chr"$c".cbs;done

Дайте мне знать, если это работает для вас.

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