将文件名前缀作为输入传递给程序

时间:2016-10-12 11:55:14

标签: linux shell

我有一些名称如下的文件:

A-C-F3_accepted_hits.bam
A-VR-M6R_accepted_hits.bam

文件存储在Linux服务器上。我想从所有具有A-C-F3扩展名的文件中提取下划线之前的字符串(即A-VR-M6R.bam等)。

随后,我想将这些字符串用作由另一个程序生成的输出文件的前缀,该程序将使用*_accepted_hits.bam文件进行输入。

更具体地说,我的意见如下:

 samtools sort -n A-C-F3_accepted_hits.bam A-C-F3_sorted
 samtools sort -n A-VR-M6R_accepted_hits.bam A-VR-M6R_sorted

这里的samtools将对A-C-F3_accepted_hits.bam的内容进行排序。我想输出文件前缀为A-C-F3_sorted,后跟默认扩展名。同样,我有17个文件,我想在其上执行此任务。希望这能使事情变得清晰。 感谢。

3 个答案:

答案 0 :(得分:0)

以下Bash脚本从匹配.*_accepted_hits.bam模式的文件构建一串命令行参数,然后使用这些参数执行php /tmp/test.php

#!/bin/bash -

args=""
while read name
do
    name=$(basename "$name")
    args="$args $(builtin printf ' --input=%q' "${name%%_*}")"
done < <(find -type f -regex '.*_accepted_hits.bam')
eval "php /tmp/test.php $args"

/tmp/test.php

<?php
$o = getopt('i:', ['input:']);
var_dump($o);

示例文件

A-C-F3_accepted_hits.bam
A-VR-M6R_accepted_hits.bam
X Y Z_accepted_hits.bam

示例输出

array(1) {
  ["input"]=>
  array(3) {
    [0]=>
    string(6) "A-C-F3"
    [1]=>
    string(5) "X Y Z"
    [2]=>
    string(8) "A-VR-M6R"
  }
}

注意,eval通常被认为是不安全的,因为可能会评估恶意代码(特别是可能会注入文件名)。另请注意使用内置的printf请参阅info bash printf )函数,该函数会转义特殊的shell字符。

答案 1 :(得分:0)

您可以使用awk提取文件名的前缀,并将其附加到文件名的公共部分。

OCOMM=_accepted_hits.bam
for i in `ls *.bam`;
    do
            OFILE=`echo $i | awk -F_ '{print $1}'`;
            FILENAME=$OFILE$OCOMM;
            echo $FILENAME;
    done

答案 2 :(得分:0)

得到了解决方案。它如下:

for sample in A*_accepted_hits.bam
    do
        echo $sample
        prefix=$(echo ${sample} | awk -F_ '{print $1}')
        echo $prefix
        samtools sort -n ${prefix}_accepted_hits.bam ./tophat_sorted/${prefix}_sorted
    done