Как запустить команду в цикле для пар файлов, которые разделяют только начальную часть имени файла

У меня есть сотни файлов, и мне нужно запустить команду для пар таких файлов, которые разделяют только начальную часть имени файла. Например:

samtools merge Sample_1_L5.bam Sample_1_L6.bam 
samtools merge Sample_2_L4.bam Sample_2_L5.bam 

По сути, пары разделяют часть имени файла Sample_x, и я хотел бы сделать цикл for, чтобы выполнить команду для всех файлов в парах, сопоставленных на основе этого Начальная часть имени файла.

Надеюсь, это достаточно ясно.

Спасибо за вашу помощь! Joanito

0
задан 22 June 2019 в 17:46

1 ответ

Хитрая часть будет держать пары в числовом порядке. Дано:

$ ls *.bam
Sample_1_L5.bam  Sample_2_L4.bam  Sample_3_L10.bam
Sample_1_L6.bam  Sample_2_L5.bam  Sample_3_L9.bam

, затем используя bash и sort с опцией -V (--version-sort)

$ printf '%s\0' *.bam | sort -zV | xargs -0 -n2 echo samtools merge
samtools merge Sample_1_L5.bam Sample_1_L6.bam
samtools merge Sample_2_L4.bam Sample_2_L5.bam
samtools merge Sample_3_L9.bam Sample_3_L10.bam

Если доступно zsh, вы можете заказать расширение glob изначально:

 % print -rN -- *.bam(n) | xargs -0 -n2 echo samtools merge
samtools merge Sample_1_L5.bam Sample_1_L6.bam
samtools merge Sample_2_L4.bam Sample_2_L5.bam
samtools merge Sample_3_L9.bam Sample_3_L10.bam

В обоих случаях удалите echo, как только вы будете довольны, предложенные отображения верны.

0
ответ дан 22 June 2019 в 17:46

Другие вопросы по тегам:

Похожие вопросы: