【问题标题】:naming output files using variable parameters and input filenames in bash在 bash 中使用可变参数和输入文件名命名输出文件
【发布时间】:2015-01-14 15:50:55
【问题描述】:

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

例如像 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 ;

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

【问题讨论】:

  • 一般来说,行尾不需要分号。将output=${model}"_"${file} 替换为output="${model}_${file}"。这些是一般性观察,不是您问题的答案。

标签: bash parameters output filenames


【解决方案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
...

【讨论】:

    【解决方案2】:

    我认为你的问题是当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 更清晰(但我可能会因多年经验而产生偏见,在此期间没有其他选择)。此外,在某些极端情况下,字符串操作表达式不能很好地工作,但命令可以正常工作,但它们不太可能真正影响您的代码。

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

    【讨论】:

    • 谢谢乔纳森!我会玩这些。
    猜你喜欢
    • 1970-01-01
    • 2014-09-08
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    相关资源
    最近更新 更多