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

BCA*_*Arg 1 pipe io-redirection xargs bioinformatics

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

PD180425_aligned_minimap.sam
PD180793_aligned_minimap.sam
Run Code Online (Sandbox Code Playgroud)

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

samtools view -Sb pattern.sam > pattern.bam
Run Code Online (Sandbox Code Playgroud)

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

ls *.sam | cut -d "_" -f 1 | xargs -i samtools view -Sb {}_aligned_minimap.sam > {}_aligned_minimap.bam
Run Code Online (Sandbox Code Playgroud)

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

我该怎么做呢?

小智 6

我对此的首选方法是这样的:

for SAM_FILE in *.sam; do
    samtools view -Sb "$SAM_FILE" > "${SAM_FILE/sam/bam}"
done
Run Code Online (Sandbox Code Playgroud)

可以做成一个像

for SAM_FILE in *.sam; do samtools view -Sb "$SAM_FILE" > "${SAM_FILE/sam/bam}"; done
Run Code Online (Sandbox Code Playgroud)

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

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

  • 您还可以使用`"${SAM_FILE%.sam}.bam"` 来更改扩展名。与 `${//}` 相比,它有两个优点:1) 它是一个标准特性,与 `${//}` 不同,因此可以在任何类似 `sh` 的 shell 中使用,以及 2) 它仅在字符串的末尾,因此文件名的中间是否包含`sam` 无关紧要。 (4认同)