如何根据多个文件的结果创建新文件并将文件名保留为第一列?

如何根据多个文件的结果创建新文件并将文件名保留为第一列?

我想从多个bam(二进制文件格式)文件中提取特定行。我可以使用以下命令从单个文件中选择行bam

samtools view -c TCGA-BH-A0BW-11A.sorted.bam "5:13744354-13744380"
550

我有一个包含 100 个文件的目录,bam如下所示:

TCGA-AC-A2FB-11A.sorted.bam
TCGA-AC-A2FF-11A.sorted.bam
TCGA-AC-A2FM-11B.sorted.bam
TCGA-AC-A2QH-01A.sorted.bam
TCGA-AC-A2QJ-01A.sorted.bam
TCGA-BH-A0BW-11A.sorted.bam
TCGA-BH-A0BW-01A.sorted.bam
TCGA-CH-A0BW-11A.sorted.bam

如何将该命令应用于多个bam文件并将输出保存在单个文件中,其中第一列作为不带扩展名的文件名,第二列是samtools该文件上的命令的结果?

例如:它应该看起来像这样

TCGA-BH-A0BW-11A     550
TCGA-BH-A0BW-01A     220
TCGA-CH-A0BW-11A     100

我正在Linux系统上工作。

答案1

如果您使用的是bash,则可以迭代具有适当扩展名的所有文件,并按如下方式处理它们:

for file in *.sorted.bam
do
    key="${file%.sorted.bam}"
    value="$(samtools view -c "$file" "5:13744354-13744380")"
    echo "$key $value"
done > output.txt

在循环中,我们

  • .sorted.bam通过从文件名末尾删除来生成文件密钥(并将其存储在 shell 变量中key
  • 执行单文件示例中所示的处理并将输出存储在 shell 变量中value
  • 打印键和值

并将循环的整体输出重定向到文件output.txt

相关内容