为什么我的代码中的这个命令给出了与终端中相同命令不同的结果?

时间:2013-10-07 21:07:10

标签: bash unix filter grep

* *编辑:好的,所以到目前为止我已尝试实施每个人的建议。

- 我在每个变量“$ 1”和“$ codon”周围添加引号以避免空格。

- 我已将-ioc标志添加到grep以避免上限。

- 我尝试使用tr -d'',但这会导致运行时错误,因为它说-d''是一个无效的选项。

不幸的是,我仍然看到同样的问题。或者是一个不同的问题,它告诉我每个密码子只出现一次。这是一种不同的错误。

到目前为止感谢所有事情 - 我仍然对新想法持开放态度。我已在下面更新了我的代码。 * *

我有这个bash脚本应该计算给定文件中(A C G T)的所有排列。

脚本的一行没有给我想要的结果,我不知道为什么 - 特别是因为我可以在命令提示符中输入完全相同的代码行并获得所需的结果。

在命令提示符中执行的行是:

cat dnafile | grep -o GCT | wc -l

这一行告诉我正则表达式“GCT”出现在文件dnafile中的次数。当我运行此命令时,我得到的结果是10(这是准确的)。

在代码本身中,我运行相同命令的修改版本:

cat $1 | grep -o $codon | wc -l

其中$ 1是文件名,$ codon是3个字母的组合。当我从程序中运行它时,我得到的答案总是0(这显然不准确)。

我希望你们中的一个好男人能够启发这个失落的灵魂,为什么这不能按预期工作。

非常非常感谢你!

我的代码:

#!/bin/bash
#countcodons <dnafile> counts occurances of each codon in sequence contained within <dnafile> 


if [[ $# != 1 ]] 
    then echo "Format is: countcodons <dnafile>"
    exit
fi

nucleos=(a c g t)
allCods=()

#mix and match nucleotides to create all codons

for x in {0..3}
do 
    for y in {0..3}
    do 
        for z in {0..3}
        do 
            perm=${nucleos[$x]}${nucleos[$y]}${nucleos[$z]}     
            allCods=("${allCods[@]}" "$perm") 
        done
    done
done


#for each codon, use grep to count # of occurances in file

len=${#allCods[*]} 
for (( n=0; n<len; n++ ))
do
    codon=${allCods[$n]}
    occs=`cat "$1" | grep -ioc "$codon" | wc -l`

    echo "$codon appears: $occs"    
#   if (( $occs > 0 ))
#   then
#       echo "$codon : $occs"
#   fi
done

exit

3 个答案:

答案 0 :(得分:3)

您以小写形式生成序列。你的代码为gct而不是GCT。您想要将-i开关添加到grep。尝试:

occs=`grep -ioc $codon $1`

答案 1 :(得分:0)

尝试:

occs=`cat $1 | grep -o $codon | wc -l | tr -d ' '`

问题是wc缩进输出,所以$occs在开头有一堆空格。

答案 2 :(得分:0)

你的逻辑向后 - 你不应该为每个密码子读取一次输入文件,你只需要读一次并检查每一个密码子的每一行。

您没有提供任何样本输入或预期输出,因此未经测试,但这样的方法是正确的方法:

awk '
BEGIN {
    nucleosStr="a c g t"
    split(nucleosStr,nucleos)

    #mix and match nucleotides to create all codons
    for (x in nucleos) {
        for (y in nucleos) {
            for (z in nucleos) {
                perm = nucleos[x] nucleos[y] nucleos[z]    
                allCodsStr = allCodsStr (allCodsStr?" ":"") perm
            }
        }
    }

    split(allCodsStr,allCods)
}
{
    #for each codon, count # of occurances in file
    for (n in allCods) {
        codon = allCods[n]
        if ( tolower($0) ~ codon ) {
            occs[n]++
        }
    }
}

END {
    for (n in allCods) {
        printf "%s appears: %d\n", allCods[n], occs[n]
    }
}
' "$1"

如果你的文件适中,我希望你会看到这种方法带来巨大的性能提升。