2014-04-28 42 views

回答

0

awk給你一些:

awk -v FS="" '!/^>/ {print f,NF} {f=substr($0,2)}' file 
seq1 6 
seq3 8 

要獲得seq2你可以這樣做:

awk '{printf (/^>/&&NR>1?RS:"")"%s ",$0} END {print ""}' file | awk '{print substr($1,2),length($2)}' 
seq1 6 
seq2 0 
seq3 8 

第一部分將所有seq和信息更改爲一行,下一部分給出長度。

+0

感謝一個單獨的數組你爲你的答案。我應該將seq2作爲零輸出。是否有可能? – user3580414

+0

@ user3580414查看我更新的答案。 – Jotne

+0

非常感謝。 – user3580414

1

這一行是不是很好,但適用於你的例子:

kent$ paste f <(sed '1d' f)|awk '/^>/{print $1, ($2~/^>/?0:length($2))}' 
>seq1 6 
>seq2 0 
>seq3 8 
0
$ awk -F'>' ' 
    NF==2 { seq=$2; lgth[seq]=0; next } 
    { lgth[seq]=length($0) } 
    END { for (seq in lgth) print seq, lgth[seq] } 
' file 
seq1 6 
seq2 0 
seq3 8 

如果你關心輸出的順序,只是不停地seq

$ awk -F'>' ' 
    NF==2 { seq=$2; seqs[++numSeqs]=seq; next} 
    { lgth[seq]=length($0) } 
    END { for (i=1; i<=numSeqs; i++) print seqs[i], lgth[seqs[i]]+0 } 
' file 
seq1 6 
seq2 0 
seq3 8