grep: один шаблон работает, но не другой - PullRequest
0 голосов
/ 22 сентября 2011

У меня есть файл с разделителями teb, в котором имена генов находятся в одном столбце, а значения выражений для этих генов - в другом. Я хочу удалить определенные гены из этого файла, используя grep. Итак, это:

"42261" "SNHG7" "20.2678"
"42262" "SNHG8" "25.3981"
"42263" "SNHG9" "0.488534"
"42264" "SNIP1" "7.35454"
"42265" "SNN"   "2.05365"
"42266" "snoMBII-202"   "0"
"42267" "snoMBII-202"   "0"
"42268" "snoMe28S-Am2634"   "0"
"42269" "snoMe28S-Am2634"   "0"
"42270" "snoR26"    "0"
"42271" "SNORA1"    "0"
"42272" "SNORA1"    "0"

становится таким:

"42261" "SNHG7" "20.2678"
"42262" "SNHG8" "25.3981"
"42263" "SNHG9" "0.488534"
"42264" "SNIP1" "7.35454"
"42265" "SNN"   "2.05365"

Я использовал следующую команду, которую я собрал вместе с моим ограниченным знанием терминала:

grep -iv sno* <input.text> | grep -iv rp* | grep -iv U6* | grep -iv 7SK* > <output.txt>

Итак, с помощью этой команды в моем выходном файле отсутствуют гены, начинающиеся с sno, u6 и 7sk, но каким-то образом grep удалил все гены, в которых есть «r», вместо тех, которые начинаются с «rp». Я очень смущен по этому поводу. Есть идеи, почему sno * работает, а rp * нет?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 22 сентября 2011
 grep -iEv "sno|rp|U6|7SK" yourInput

тест:

kent$  cat b
"42261" "SNHG7" "20.2678"
"42262" "SNHG8" "25.3981"
"42263" "SNHG9" "0.488534"
"42264" "SNIP1" "7.35454"
"42265" "SNN"   "2.05365"
"42266" "snoMBII-202"   "0"
"42267" "snoMBII-202"   "0"
"42268" "snoMe28S-Am2634"   "0"
"42269" "snoMe28S-Am2634"   "0"
"42270" "snoR26"    "0"
"42271" "SNORA1"    "0"
"42272" "SNORA1"    "0"

kent$  grep -iEv "sno|rp|U6|7SK" b
"42261" "SNHG7" "20.2678"
"42262" "SNHG8" "25.3981"
"42263" "SNHG9" "0.488534"
"42264" "SNIP1" "7.35454"
"42265" "SNN"   "2.05365"
0 голосов
/ 22 сентября 2011

Команда grep использует регулярные выражения, а не глобальные шаблоны.

Шаблон rp* означает «r», за которым следует ноль или более «p». То, что вы действительно хотите, это rp.*, или даже лучше, "rp.* (или даже просто "rp, в конце концов, нет смысла пытаться найти что-нибудь после "rp"). Аналогично, sno* означает «sn», за которым следует ноль или более «o». Опять же, вы хотели бы sno.* или "sno.* (или даже просто "sno).

0 голосов
/ 22 сентября 2011

Хотя это не дает прямого ответа на ваш вопрос, есть одна вещь в вашей командной строке, с которой вы можете быть осторожны: всякий раз, когда вы используете специальный метасимвол оболочки (например, "*"), вам необходимоубежать или процитировать это.Таким образом, ваша командная строка должна выглядеть примерно так:

grep -iv 'sno*' <input.text> | grep -iv 'rp*' | grep -iv 'U6*' | grep -iv '7SK*' > <output.txt>

Часто оболочки являются умными, и если файлы не соответствуют глобусу, они будут использовать текст как есть (поэтому, если вы введете «foo *», нонет имен файлов, начинающихся с «foo», тогда в команду будет передана строка «foo *»).

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