У меня есть сотни файлов, и мне нужно запустить команду для пар таких файлов, которые разделяют только начальную часть имени файла. Например:
samtools merge Sample_1_L5.bam Sample_1_L6.bam
samtools merge Sample_2_L4.bam Sample_2_L5.bam
По сути, пары разделяют часть имени файла Sample_x, и я хотел бы сделать цикл for, чтобы выполнить команду для всех файлов в парах, сопоставленных на основе этого Начальная часть имени файла.
Надеюсь, это достаточно ясно.
Спасибо за вашу помощь! Joanito
Хитрая часть будет держать пары в числовом порядке. Дано:
$ 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
, как только вы будете довольны, предложенные отображения верны.