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