我有一些名称如下的文件:
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个文件,我想在其上执行此任务。希望这能使事情变得清晰。 感谢。
答案 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