Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在awk中汇总文本文件_Awk_Fasta - Fatal编程技术网

在awk中汇总文本文件

在awk中汇总文本文件,awk,fasta,Awk,Fasta,我有一个字符序列,我想将每个序列从头到尾拆分为3个字符类。学生们可以得到每个班级的人数。下面是2id字符序列的一个小示例 >ID1 ATGTCCAAGGGGATCCTGCAGGTGCATCCTCCGATCTGCGACTGCCCGGGCTGCCGAATA TCCTCCCCGGTGAACCGGGGGCGGCTGGCAGACAAGAGGACAGTCGCCCTGCCTGCCGCC >ID2 ATGAAACTTTCACCTGCGCTCCCGGGAACAGTTTCTGCTCGGACTCCTGAT

我有一个字符序列,我想将每个序列从头到尾拆分为
3个字符类
。学生们可以得到每个班级的人数。下面是2
id
字符序列的一个小示例

>ID1
ATGTCCAAGGGGATCCTGCAGGTGCATCCTCCGATCTGCGACTGCCCGGGCTGCCGAATA
TCCTCCCCGGTGAACCGGGGGCGGCTGGCAGACAAGAGGACAGTCGCCCTGCCTGCCGCC
>ID2
ATGAAACTTTCACCTGCGCTCCCGGGAACAGTTTCTGCTCGGACTCCTGATCGTTCACCT
CCCTGTTTTCCCGACAGCGAGGACTGTCTTTTCCAACCCGACATGGATGTGCTCCCAATG
ACCTGCCCGCCACCACCAGTTCCAAAGTTTGCACTCCTTAAGGATTATAGGCCTTCAGCT
下面是
ID1
输出的一个小示例。我希望为输入文件中的所有
ID
获得相同的输出(字符行属于下一行中的每个
ID
)。下一个
ID
的计数紧跟在第一个之后,依此类推

ID1_3nt count
ATG 1
TCC 3
AAG 2
GGG 2
ATC 2
CTG 3
CAG 1
GTG 2
CAT 1
CCT 2
CCG 3
TGC 3
GAC 2
GGC 1
CGA 1
ATA 1
AAC 1
CGG 2
GCA 1
AGG 1
GCC 3
ACA 1
GTC 1
我尝试了以下代码:

awk '{i=0; printf ">%s\n",$2; while(i<=length($1)) {printf "%s\n", substr($1,i,3);i+=3}} /,substr,/ {count++}' | awk 'END { printf(" ID_3nt: %d",count)}

awk'{i=0;printf'>%s\n',$2;while(i这个基于
patsplit()
的实现怎么样

#! /usr/bin/awk -f

# initialize publicly scoped vars...
function init() {
    split("", idx) # index of our class (for ordering)
    split("", cls) # our class name
    split("", cnt) # num of classes we have seen
    sz = 0         # number of classes for this ID
}

# process a class record
function proc(    i, n, x) {
    # split on each 3 characters
    n = patsplit($0, a, /.../)
    for (i=1; i<=n; ++i) {
        x = a[i]
        if (x in idx) {
            # if this cls exists, just increment the count
            ++cnt[idx[x]]
        } else {
            # if this cls doesn't exist, index it in
            cls[sz] = x
            cnt[sz] = 1
            idx[x] = sz++
        }
    }
}

# spit out class summary
function flush(    i) {
    if(!sz)
        return
    for(i=0; i<sz; ++i)
        print cls[i], cnt[i]
    init()
}

BEGIN {
    init()
}

/^>ID/ {
    flush()
    sub(/^>/, "")
    print $0 "_3nt count"
    next
}

{
    # we could have just inlined proc(), but using a function
    # provides us with locally scoped variables
    proc()
}

END {
    flush()
}
!/usr/bin/awk-f
#初始化公共作用域变量。。。
函数init(){
拆分(“,idx)#我们类的索引(用于排序)
拆分(“,cls)#我们的类名
split(“,cnt)#我们看到的类的数量
sz=0#此ID的类数
}
#处理课堂记录
函数过程(i,n,x){
#每3个字符拆分一次
n=patsplit($0,a,/…/)
对于(i=1;i


当前代码有什么问题吗?
awk
是一个严格的要求吗?它返回的输出与我正在寻找的不一样。我正在使用awk。它输出什么?并且
awk
是一个严格的要求吗?@john,请解释一下输出中的计数是如何来的?如果输入值仅为
atgtccaggg
,这应该是4吗plets(
ATG
TCC
AAG
GGG
),还是应该是10个三胞胎(
ATG
TGT
GTC
TCC
,…
GGG
)?这与您的预期输出不符(需要大量计数才能得出答案).三胞胎的顺序和数量重要吗?
$ cat tst.awk
sub(/^>/,"") { if (NR>1) prt(); name=$0; next }
{ rec = rec $0 }
END { prt() }
function prt(    cnt, class) {
    while ( rec != "" ) {
        cnt[substr(rec,1,3)]++
        rec = substr(rec,4)
    }
    print name "_3nt count"
    for (class in cnt) {
        print class, cnt[class]
    }
}
$ awk -f tst.awk file
ID1_3nt count
ACA 1
AAC 1
CGA 1
CAT 1
GTG 2
CAG 1
GGG 2
CCG 3
CCT 2
GCA 1
ATA 1
GAC 2
AAG 2
GCC 3
ATC 2
TCC 3
CGG 2
CTG 3
GTC 1
AGG 1
GGC 1
TGC 3
ATG 1
ID2_3nt count
AAA 1
CCC 3
ACA 1
GTG 1
TTT 2
TGT 2
GTT 2
ACC 1
CCG 2
CTC 3
CCT 4
GCA 1
AAG 2
GAC 3
TCA 3
AGC 1
ACT 1
CGT 1
CGG 1
CTT 3
TAT 1
CAA 1
GAG 1
GAT 3
GGA 1
AGG 1
TGC 1
CCA 5
TTC 1
GCT 2
TCT 1
GCG 1
ATG 3