Объединение замещающих строк и регулярных выражений в GNU Parallel - PullRequest
1 голос
/ 15 февраля 2020

У меня есть список путей к файлам в формате:

/data/nicotine_sensi/bam/9-2_box_1_S23_starAligned.sortedByCoord.out.bam
/data/nicotine_sensi/bam/9-2_box_3_S101_starAligned.sortedByCoord.out.bam
/data/nicotine_sensi/bam/9-3_box_1_S24_starAligned.sortedByCoord.out.bam
/data/nicotine_sensi/bam/9-3_box_3_S102_starAligned.sortedByCoord.out.bam

Я хочу ввести параллельную команду gnu, чтобы как предопределенные строки замены, так и строка замены perl или --plus работать в то же время, но я не смог найти решение в учебниках . В идеале, {/...} и {%_starAligned} оба будут работать вместе, чтобы произвести:

9-2_box_1_S23
9-2_box_3_S101
9-3_box_1_S24
9-3_box_3_S102

, однако самое близкое, что я получаю, это:

parallel --rpl '{..} s:/data/nicotine_sensi/bam/::;s:_starAligned.sortedByCoord.out.bam::' \
  echo {..} ::: $(ls $bam_dir/*.bam)

, который является грязным и не очень портативным для другие каталоги.

1 Ответ

1 голос
/ 17 февраля 2020

Определение {/...}:

s:.*/::; s:\.[^/.]+$::; s:\.[^/.]+$::; s:\.[^/.]+$::;

Определение {%(.*)}:

s/$$1$//;

Таким образом, вы можете сделать:

echo /data/nicotine_sensi/bam/9-3_box_1_S24_starAligned.sortedByCoord.out.bam |
  parallel --rpl '{¤([^}]+?)} s:.*/::; s:\.[^/.]+$::; s:\.[^/.]+$::; s:\.[^/.]+$::; s/$$1$//;' echo {¤_starAligned}

Если вы знаете, что вы всегда будете удалять _something, тогда:

echo /data/nicotine_sensi/bam/9-3_box_1_S24_starAligned.sortedByCoord.out.bam |
  parallel --rpl '{¤} s:.*/::; s:\.[^/.]+$::; s:\.[^/.]+$::; s:\.[^/.]+$::; s/_[^_]+$//;' echo {¤}

Если вы будете использовать это часто, то, вероятно, будет хорошей идеей поместить его в профиль.

...