使用 xargs 将 ls 输出重定向到另一个命令

使用 xargs 将 ls 输出重定向到另一个命令

在我正在处理的目录中,有两个扩展名为 的文件.sam

PD180425_aligned_minimap.sam
PD180793_aligned_minimap.sam

对于这两个文件中的每一个,我需要应用如下命令:

samtools view -Sb pattern.sam > pattern.bam

我正在尝试用于xargs此目的。我想做的是捕获之前的前缀_aligned_minimap并使用它保存到我的输出中。我尝试的是以下内容:

ls *.sam | cut -d "_" -f 1 | xargs -i samtools view -Sb {}_aligned_minimap.sam > {}_aligned_minimap.bam

我希望必须生成 iePD180425_aligned_minimap.bamPD180793_aligned_minimap.bam.尽管我的命令正在运行,但我在正在处理的目录中看到{}_aligned_minimap.bam生成了该文件,这表明我尝试使用 xargs (PD180425PD180793)捕获的输入不起作用。

我该怎么做呢?

答案1

我首选的方法是这样的:

for SAM_FILE in *.sam; do
    samtools view -Sb "$SAM_FILE" > "${SAM_FILE/sam/bam}"
done

它可以制成一个衬垫,例如

for SAM_FILE in *.sam; do samtools view -Sb "$SAM_FILE" > "${SAM_FILE/sam/bam}"; done

这使用参数扩展来更改输出文件扩展名: https://wiki.bash-hackers.org/syntax/pe

在我看来,如果您或其他人稍后偶然发现您的脚本,这种风格可以清楚地表明您正在尝试做什么。

答案2

我的命令经过轻微修改,我认为它比for循环更简单、更简洁:

ls *.sam | cut -d "_" -f 1 | xargs -I {} bash -c " samtools view -Sb {}_aligned_minimap.sam > {}_aligned_minimap.bam"

相关内容