如何在仅共享文件名初始部分的文件对上循环运行命令

如何在仅共享文件名初始部分的文件对上循环运行命令

我有数百个文件,我需要对仅共享文件名初始部分的文件对运行一个命令。例如:

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

本质上,这些对共享文件名的 Sample_x 部分,我想创建一个 for 循环,以便对根据文件名的初始部分匹配的所有文件运行命令。

希望这足够清楚。

谢谢你的帮助!Joanito

答案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在这两种情况下,一旦您确信所提出的映射是正确的,就删除它。

相关内容