【问题标题】:Generating different filenames from unique file in shell script从 shell 脚本中的唯一文件生成不同的文件名
【发布时间】:2013-04-14 20:25:56
【问题描述】:

我需要执行我的 evaluateParameters.pl Perl 程序,为此,我想创建一个 shell 脚本。

#!/bin/bash

COVARIANCE=~/Desktop/ncRNA/CovarianceModels/rRNAs_cov/bitscores.rRNA.dat         # First input FILE
BASEPATH='/Desktop/ncRNA/Data/Inputs/rRNAs/60/'

TRUEFILES=~/$BASEPATH/Infernal/*.table                  # Second input File   
CONTROLFILES=~/$BASEPATH/RandomControl/Infernal/*.table # third input file
INPUTFILES=~/$BASEPATH/*.fasta                          # fourth input file   
for i in $COVARIANCE
do
    NAME1=`basename $i`
    for t in $TRUEFILES
    do
        # i.e : 1dvex4_rRNA_cin.out.db.location.fasta.RF00001.cm.tab.table
        NAME=`basename $t`
        echo "Calculating the parameters to $NAME"

        # I need modify $NAME to convert in: 1dvex4_rRNA.cin.out.db.location.fasta
        FILER=$(echo $NAME | sed s/(.*\.fasta)\.(.*\.tab\.table)/\1/g)

        # I need modify $NAME to convert in: 
        # 1dvex4_rRNA.cin.out.db.location.fasta.mutant.fasta.RF00001.cm.tab.table
        FILEM=$(echo $NAME | sed s/(.*\.fasta\.)(.*\.tab\.table)/\1\.mutate\.fasta\2/g)
        perl evaluateParameters.pl $i ~/$BASEPATH/Infernal/$NAME ~/$BASEPATH/RandomControl/Infernal/$FILEM ~/$BASEPATH/$FILER
        echo "END!"
    done
done

最后一个代码向我发送以下警告:

Calculating the parameters to                                 10dvex1_rRNA_ce.out.db.location.fasta.RF00001.cm.tab.table.false.table.false.table.true.table.true.table.true.table .false.table
./obtainParameters.sh: command substitution: line 31: syntax error near unexpected token `('
./obtainParameters.sh: command substitution: line 31: `echo $NAME | sed s/(.*\.fasta)\.(.*\.tab\.table)/\1/g'
./obtainParameters.sh: command substitution: line 32: syntax error near unexpected token `('
./obtainParameters.sh: command substitution: line 32: `echo $NAME | sed s/(.*\.fasta\.)(.*\.tab\.table)/\1\.mutate\.fasta\2/g'

一些想法?我猜错误在 $NAME 的正则表达式中,但我无法获得正确的正则表达式结果。提前致谢!

【问题讨论】:

    标签: regex perl bash shell variables


    【解决方案1】:

    有几件事让我感到震惊:

    1) 你的 do 和 done 语句不匹配(你有一个额外的“完成”)。

    2) 在 sed 表达式周围加上单引号;括号被 bash 解释为子进程。

    具有语法高亮功能的优秀编程文本编辑器对此有很大帮助。

    【讨论】:

    • 但是,在这种情况下,$NAME1 代表第一个文件名,它不会改变。但我有兴趣在 $NAME 上应用 REGEX 策略……是的,存在一个额外的“完成”。谢谢!我正在使用 vim。
    • 从答案中删除了关于 $NAME 的注释;我忽略了定义。如果你输入<esc>:syntax on,你会得到bash的语法高亮;这向我展示了额外的done 以红色突出显示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多