我有一些文件名如下的文件:
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