使用bash中的变量参数和输入文件名命名输出文件

时间:2015-01-14 15:50:55

标签: bash parameters output filenames

我在子目录中有一系列文件,我想根据输入的文件名和我用来处理文件的各种参数(模型)循环,处理和命名。

例如文件名,如AG005574,AG004788,AG003854和参数/模型值,如ATd,PZa,RTK1,所以我想以像 AG005574_ATd AG005574_PZa AG005574_RTK1 AG004788_ATd AG004788_PZa 等等 我循环遍历子文件夹,运行该过程并输出结果,如下所示:

#!/usr/bin/bash

model=$1
for file in $(find /path/to/files/*/ -type f -name 'AG*.fa');
     do output=${model}"_"${file} ;
        process_call --out=$output."tab" --options ../Path/to/model/$1.hmm $file ;
    echo $file
done

我希望能够在命令行上指定模型(因此模型= $ 1)。但是,我的方法一般不起作用;我可以使用

获取模型命名的输出
do output=$model ;

但是这也只写了最后处理的文件,因为它覆盖了所有其他文件(并且没有使用输入文件名)。非常感谢任何帮助/辅导。

2 个答案:

答案 0 :(得分:1)

我认为您的问题是find提供的文件名是:

/path/to/files/xyz/AG002378.fa

您的output参数变为,$1ATd

ATd_/path/to/files/xyz/AG002378.fa

而不是:

/path/to/files/xyz/AG002378_ATd

也就是说,您希望删除.fa,并添加_ATd

经典命令是dirnamebasename

dir=$(dirname "$file")
base=$(basename "$file" .fa)
output="$dir/${file}_$1"

您可以使用以下方法:

base_with_suffix=${file##*/}
base=${base_with_suffix%.fa}

不调用外部命令。 dirname操作也可以完成:

dir=${file%/*}

但我认为basenamedirname更清楚(但我可能会被多年的经验所困扰,在此期间没有替代方案)。此外,还有一些边缘情况,字符串处理表达式不能正常工作,但命令可以正常工作,但它们不太可能真正影响您的代码。

您的问题并不完全清楚您想要的输出结果,但所显示主题的变化应该可以让您解决问题。

答案 1 :(得分:1)

将所有模型名称作为参数传递给脚本:

/path/to/script ATd PZa RTK1

然后

#!/bin/bash    
find /path/to/files/*/ -type f -name 'AG*.fa' | 
while IFS= read -r file; do
    echo "$file"
    for model in "$@"; do
        output="${file%.fa}_$model.tab"
        process_call --out="$output" --options "../Path/to/model/$model.hmm" "$file"
    done
done

如果您已经了解所有模型,则可以将其构建到脚本中:

#!/bin/bash    
models=( ATd PZa RTK1 )
...
    for model in "${models[@]}"; do
...