我必须为作业编写一个脚本,它将文件名作为命令,并输出文件中每个唯一的 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
.