西班牙下午好。我正在学习AWK,我知道如何使用管道从Linux终端执行命令,但我希望能够编写AWK脚本。让我们看看你是否可以帮助我。
我有以下代码:
awk '{if (NR!=1) {printf $0}}' sequence.fasta |
awk '{sub(/ATG/, "\n&")}{print}' |
awk 'NR == 2' | awk '{gsub(/.../, "& ")}1' |
awk '{for (i=1; i<=NF; i++) {printf $i" "; if ($i~/TAA/ || $i~/TAG/ || $i~/TGA/) {exit}}}' |
fold -w 60
从FASTA文件中,此脚本显示从START密码子(ATG)到终止密码子(TAA,TAG或TGA)。 FASTA文件具有以下结构:
>sequence.fasta
GATCCAAAACACATTCTCCCTGGTAGCATGGACAAGCAACATTTTGGGAGAAATGGAGCAAAAAAACATA
AACTTCACAGTAACAAACATAAACACTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTC
TCTCTCTCCACACACACACACACTCGCACTCACAGCCTCACAACACAGGTATACATGTTTACTTAGGTCA
CTCAGAATTGTAAACTGTAAGTGTGCCTTGCAAAGAACCACTGCTCCTTACAGTGAGCAGTGCTTACCTG
GTGCTTACCTGAAGAAGATATAGCTCCTTAAAGAGTAAATGAATAAATACCTTAAGTAAGTTTGGGAAAC
应用我上面写的代码,我得到以下输出:
ATG GAC AAG CAA CAT TTT GGG AGA AAT GGA GCA AAA AAA CAT AAA
CTT CAC AGT AAC AAA CAT AAA CAC TCT CTC TCT CTC TCT CTC TCT
CTC TCT CTC TCT CTC TCT CTC TCT CTC TCT CCA CAC ACA CAC ACA
CTC GCA CTC ACA GCC TCA CAA CAC AGG TAT ACA TGT TTA CTT AGG
TCA CTC AGA ATT GTA AAC TGT AAG TGT GCC TTG CAA AGA ACC ACT
GCT CCT TAC AGT GAG CAG TGC TTA CCT GGT GCT TAC CTG AAG AAG
ATA TAG
所以,我的代码是这样做的:
除了标题之外,它会打印所有序列。 Printf打印时没有\ n。
awk '{if (NR!=1) {printf $0}}' sequence.fasta
它寻找第一个ATG并引入一条新线。
awk '{sub(/ATG/, "\n&")}{print}'
正如我们刚刚在ATG启动时引入新线路时,请选择第2行,忽略第1行(5'-UTR)。
awk 'NR == 2'
现在,我们创建密码子,用空格隔开。
awk '{gsub(/.../, "& ")}1'
现在,通过循环,我们正在寻找一个终止密码子。找到它时,循环停止。
awk '{for (i=1; i<=NF; i++) {printf $i" "; if ($i~/TAA/ || $i~/TAG/ || $i~/TGA/) {exit}}}'
为了更好地查看,我们将宽度设为60个字符。
fold -w 60
所以,我试图将所有内容放在script.awk
中,但它不起作用。我知道用awk并不像写在一起那么简单。那么,请问你帮帮我吗?
答案 0 :(得分:2)
看起来您要做的就是跳过第一行,然后从文件中第一次出现的“ATG”打印到第一次出现的TAA,TGA或TAG,并组合3个字母并打印出来排成15列的行。如果是这样,那只是这个:
$ cat file
>whatever
GATCCAAAACACATTCTCCCTGGTAGCATGGACAAGCAACATTTTGGGAGAAATGGAGCAAAAAAACATA
AACTTCACAGTAACAAACATAAACACTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTC
TCTCTCTCCACACACACACACACTCGCACTCACAGCCTCACAACACAGGTATACATGTTTACTTAGGTCA
CTCAGAATTGTAAACTGTAAGTGTGCCTTGCAAAGAACCACTGCTCCTTACAGTGAGCAGTGCTTACCTG
GTGCTTACCTGAAGAAGATATAGCTCCTTAAAGAGTAAATGAATAAATACCTTAAGTAAGTTTGGGAAAC
$
$ cat tst.awk
NR>1 { rec = rec $0 }
END {
if ( match(rec,/ATG/) ) {
rec = substr(rec,RSTART)
gsub(/.../,"& ",rec)
match(rec,/(TAA|TAG|TGA) /)
rec = substr(rec,1,RSTART+RLENGTH-2)
gsub(/(... ){15}/,"&\n",rec)
print rec
}
}
$
$ awk -f tst.awk file
ATG GAC AAG CAA CAT TTT GGG AGA AAT GGA GCA AAA AAA CAT AAA
CTT CAC AGT AAC AAA CAT AAA CAC TCT CTC TCT CTC TCT CTC TCT
CTC TCT CTC TCT CTC TCT CTC TCT CTC TCT CCA CAC ACA CAC ACA
CTC GCA CTC ACA GCC TCA CAA CAC AGG TAT ACA TGT TTA CTT AGG
TCA CTC AGA ATT GTA AAC TGT AAG TGT GCC TTG CAA AGA ACC ACT
GCT CCT TAC AGT GAG CAG TGC TTA CCT GGT GCT TAC CTG AAG AAG
ATA TAG
$