2016-08-05 2 views
0

Я использую оболочку bash и работаю с человеческим эталонным геномом GRCh38. У меня есть список файлов в каталоге, по одному файлу для каждой хромосомы. Теперь мне нужно найти список имен файлов. Кажется тривиальным, но имена файлов неудобно имеют специальные символы. Пример:bash - обработка специальных символов в именах файлов

ls -1 ../GRCh38_chromosomes/ 

выводит содержимое каталога:

… 
HLA-DRB1*13:01:01?HLA00797_13935_bp.fa 
HLA-DRB1*13:02:01?HLA00798_13941_bp.fa 
HLA-DRB1*14:05:01?HLA00837_13933_bp.fa 
HLA-DRB1*14:54:01?HLA02371_13936_bp.fa 
HLA-DRB1*15:01:01:01?HLA00865_11080_bp.fa 
HLA-DRB1*15:01:01:02?HLA03453_11571_bp.fa 
… 

Im испытывает трудности в поиске конкретного файла (из жгутов сценария), потому что характер, в частности, кажется, заменяются на «?» «\ т». Пример:

ls -1 ../GRCh38_chromosomes/ | perl -ne ' print $_; ' 

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

… 
HLA-DRB1*13:01:01 HLA00797_13935_bp.fa 
HLA-DRB1*13:02:01 HLA00798_13941_bp.fa 
HLA-DRB1*14:05:01 HLA00837_13933_bp.fa 
HLA-DRB1*14:54:01 HLA02371_13936_bp.fa 
HLA-DRB1*15:01:01:01 HLA00865_11080_bp.fa 
HLA-DRB1*15:01:01:02 HLA03453_11571_bp.fa 
… 

это вызывает у меня головную боль при попытке поиска, такие как

ls -1 ../GRCh38_chromosomes/ | perl -ne ' if ($_ =~ /^\QHLA-DRB1*15:01:01:02?\E/) { print $_; } ' 

, который должен вывести:

HLA-DRB1*15:01:01:02?HLA03453_11571_bp.fa 

, но вместо этого ничего не находит. Ive также пробовал awk с той же проблемой, и мне интересно, почему они помещают специальные символы в имена хромосом для GRCh38? Любые идеи, как справиться с этими проблемными персонажами?

+0

Какая версия per? Я имею perl 5.16.3 и не могу дублировать этот вопрос – SaintHax

+0

У меня есть 5.22.1, но также найти то же поведение с awk – nak3c

+0

Вы не указали код awk, так что вам не о чем заняться. Избавьтесь от '-1' в ls - это не нужно. Когда вы отправляете ls в канал, он всегда находится в одном столбце. Единственный способ получить результаты - ввести 'ls -l' вместо' ls' или 'ls -1'. – SaintHax

ответ

2

Ваша диагностика выключена. Проблема в том, что ls заменяет фактический символ табуляции вопросительным знаком, но только тогда, когда его стандартный вывод является терминалом.

Это одна из многих причин you should not use ls in scripts at all.

Вы, кажется, ищет просто для

printf '%s\n' ../"HLA-DRB1*15:01:02"* 

где printf '%s\n' может быть заменен просто echo, но я предполагаю, что вниз по линии, которую вы действительно хотите использовать это выражение подстановки в for цикле или как файл name для совершенно другой команды.

Эти цитаты вызывают буквальную интерпретацию первой звездочки; вторая звездочка, вне кавычек, является подстановочным знаком, который соответствует любой строке. (Звездочка регулярных выражений, также известная как звезда Клейн, имеет другую семантику и не соответствует самому себе - вместо этого она указывает более или менее повторение предыдущего символа или сгруппированного выражения.)

+0

Спасибо за предложение, использует найти лучший вариант? например: find ../GRCh38_chromosomes/ -name «HLA-DRB1 * 15: 01: 02?» * – nak3c

+0

в любом случае, что кажется преформы, как я хочу – nak3c

Смежные вопросы