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



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

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

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

随后,我想使用这些字符串作为另一个程序生成的输出文件的前缀,该程序将使用*_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个文件,我想在这些文件上执行此任务。希望这能说清楚。谢谢。

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

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

下面的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字符。

找到解决方案了。内容如下:

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

最新更新