我有数百个文件,我需要对仅共享文件名初始部分的文件对运行一个命令。例如:
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
在这两种情况下,一旦您确信所提出的映射是正确的,就删除它。