正则表达式搜索 DNA 密码子的语法

正则表达式搜索 DNA 密码子的语法

我必须为作业编写一个脚本,它将文件名作为命令,并输出文件中每个唯一的 3 个基本密码子以及它按降序出现的次数。该脚本必须检查它是否有参数,如果没有则输出错误消息。我对如何开始以及正则表达式的语法感到困惑,我需要用脚本搜索每个唯一的密码子。要点是,一个文件除了以随机顺序重复的字母“a”“c”“t”“g”之外什么都没有,目的是编写一个脚本,该脚本将从文件的开头开始并显示每个唯一的3 个字母的密码子及其计数,例如 aac 或 acg。

例如,如果名为 dnafile 的文件包含模式 aacacgaactttaacacg,则脚本将采用以下输入和输出

$script dnafile              
aac 3
acg 2
ttt 1

如果错误检查显示错误,则应该是script cannot open file dnafile for reading

答案1

为了得到所有的完全的来自单个文件的密码子:

{
    for (pos = 1; pos < length - 1; ++pos) {
        codon = substr($0, pos, 3)
        print codon
    }
}

这个简短的awk脚本只是输出每行的每三个字符长的子字符串。用生物信息学的话说,它依次输出每一帧的完整密码子。

对您给定的数据进行测试:

$ awk -f script.awk <file
aac
aca
cac
acg
cga
gaa
aac
act
ctt
ttt
tta
taa
aac
aca
cac
acg

然后,您可以对每个密码子出现的次数进行排序和计数:

$ awk -f script.awk <file | sort | uniq -c
   3 aac
   2 aca
   2 acg
   1 act
   2 cac
   1 cga
   1 ctt
   1 gaa
   1 taa
   1 tta
   1 ttt

如果文件包含换行符,则首先删除它们以便能够获取被换行符破坏的密码子:

$ cat file
aacacgaactttaacacg
aacacgaactttaacacg
$ tr -d '\n' <file | awk -f script.awk | sort | uniq -c
   6 aac
   4 aca
   4 acg
   2 act
   4 cac
   3 cga
   2 ctt
   3 gaa
   2 taa
   2 tta
   2 ttt

(注意 和 的计数如何cga更改gaa为 3 而不是 2)

如果你的数据是大的,那么您将不得不想出其他方法来处理跨换行符的转换:

{
    $0 = lastbit $0

    for (pos = 1; pos < length - 1; ++pos) {
        codon = substr($0, pos, 3)
        print codon
    }

    lastbit = substr($0, length - 1)
}

这会保存每行的最后两个碱基lastbit并将它们添加到序列的下一行之前。

在与上面相同的两行输入上运行:

$ awk -f script.awk <file | sort | uniq -c
   6 aac
   4 aca
   4 acg
   2 act
   4 cac
   3 cga
   2 ctt
   3 gaa
   2 taa
   2 tta
   2 ttt

如果您只想要第一帧中的密码子:

{
    $0 = lastbit $0

    for (pos = 1; pos < length - 1; ++pos) {
        if ((pos + length(lastbit)) % 3 == 1) {
            codon = substr($0, pos, 3)
            print codon
        }
    }

    lastbit = substr($0, length - 1)
}

sort -nr如果您希望输出按计数降序排序,请在上面的管道中添加一个额外的步骤。

也可以看看:

答案2

人们可以在没有外部文件的情况下在一行上完成此操作,如下所示:

tr -d '\n' <dnafile |sed -e 's/\(...\)/\1\n/g' |sort |uniq -c |sed 's/^\s*\([0-9]*\) \([acgt]*\)$/\2 \1/'
aac 3
acg 2
ttt 1

如果您不需要按照指定顺序排列的列,则可以省略 后面的部分uniq -c。如果您在 Mac 上执行此操作,请使用gsed而不是sed.

相关内容