-2

来自西班牙的下午好。我正在学习 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) 到 STOP 密码子(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'

现在,通过一个循环,我们正在寻找一个 STOP 密码子。当找到它时,循环停止。

awk '{for (i=1; i<=NF; i++) {printf $i" "; if ($i~/TAA/ || $i~/TAG/ || $i~/TGA/) {exit}}}'

为了更好地查看,我们将宽度固定为 60 个字符。

fold -w 60

所以,我试图把所有的东西放在一起script.awk,但它不起作用。我知道使用 awk 并不像一起写那么简单。那么,请你帮我解决一下好吗?

4

1 回答 1

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
$
于 2013-11-08T16:51:42.477 回答