2014-06-18 2 views
3

J'ai un fichier comme suit. Je voudrais compter le nombre de chaque personnage.compter le nombre de résidus dans un fichier

>1DMLA 
MTDSPGGVAPASPVEDASDASLGQPEEGAPCQVVLQGAELNGILQAFAPLRTSLLDSLLVMGDRGILIHNTIFGEQVFLP 
LEHSQFSRYRWRGPTAAFLSLVDQKRSLLSVFRANQYPDLRRVELAITGQAPFRTLVQRIWTTTSDGEAVELASETLMKR 
ELTSFVVLVPQGTPDVQLRLTRPQLTKVLNATGADSATPTTFELGVNGKFSVFTTSTCVTFAAREEGVSSSTSTQVQILS 
NALTKAGQAAANAKTVYGENTHRTFSVVVDDCSMRAVLRRLQVGGGTLKFFLTTPVPSLCVTATGPNAVSAVFLLKPQK 
>1DMLB 
DDVAARLRAAGFGAVGAGATAEETRRMLHRAFDTLA 
>2BHDC 
MTDSPGGVAPASPVEDASDASLGQPEEGAPCQVVLQGAELNGILQAFAPLRTSLLDSLLVMGDRGILIHNTIFGEQVFLP 
LEHSQFSRYRWRGPTAAFLSLVDQKRSLLSVFRANQYPDLRRVELAITGQAPFRTLVQRIWTTTSDGEAVELASETLMKR 
ELTSFVVLVPQGTPDVQLRLTRPQLTKVLNATGADSATPTTFELGVNGKFSVFTTSTCVTFAAREEGVSSSTSTQVQILS 

J'ai essayé le code suivant.

awk '/^>/ { res=substr($0, 2); } /^[^>]/ { print res " - " length($0); }' <file 

La sortie du code ci-dessus est

1DMLA - 80 
1DMLA - 80 
1DMLA - 80 
1DMLA - 79 
1DMLB - 36 
2BHDC - 80 
2BHDC - 80 
2BHDC - 80 

Ma sortie désirée est

1DMLA - 319 
1DMLB - 36 
2BHDC - 240 

Comment puis-je modifier le code ci-dessus pour obtenir ma sortie désirée?

+0

Meilleur pour éviter ' Steve

+0

Avez-vous testé toutes les solutions? – klashxx

Répondre

0

est ici d'une manière utilisant awk:

awk '/^>/ && r { print r, "-", s; r=s="" } /^>/ { r = substr($0, 2); next } { s += length } END { print r, "-", s }' file 

Résultats:

1DMLA - 319 
1DMLB - 36 
2BHDC - 240 
0

De cette façon:

awk -F\> '/^>/ {if (seqlen != ""){print seqlen}printf("%s - ",$2);seqlen=0;next}seqlen != ""{seqlen +=length($0)}END{print seqlen}' infile 

ou formaté:

awk -F\> '/^>/ { if (seqlen != "") 
        print seqlen 
       printf("%s - ",$2) 
       seqlen=0 
       next } 
      seqlen != ""{seqlen+=length($0)} 
      END{ 
      print seqlen}' infile 

voir: Sequence length of FASTA file

Outre le résultat attendu, ce sera gérer ces formats de fichiers inattendus.

$ cat infile 
MTDSPGGVAPASPVEDASDASLGQPEEGAPCQVVLQGAELNGILQAFAPLRTSLLDSLLVMGDRGILIHNTIFGEQVFLP 
LEHSQFSRYRWRGPTAAFLSLVDQKRSLLSVFRANQYPDLRRVELAITGQAPFRTLVQRIWTTTSDGEAVELASETLMKR 
ELTSFVVLVPQGTPDVQLRLTRPQLTKVLNATGADSATPTTFELGVNGKFSVFTTSTCVTFAAREEGVSSSTSTQVQILS 
NALTKAGQAAANAKTVYGENTHRTFSVVVDDCSMRAVLRRLQVGGGTLKFFLTTPVPSLCVTATGPNAVSAVFLLKPQK 
>1DMLB 
>2BHDC 
MTDSPGGVAPASPVEDASDASLGQPEEGAPCQVVLQGAELNGILQAFAPLRTSLLDSLLVMGDRGILIHNTIFGEQVFLP 
LEHSQFSRYRWRGPTAAFLSLVDQKRSLLSVFRANQYPDLRRVELAITGQAPFRTLVQRIWTTTSDGEAVELASETLMKR 
ELTSFVVLVPQGTPDVQLRLTRPQLTKVLNATGADSATPTTFELGVNGKFSVFTTSTCVTFAAREEGVSSSTSTQVQILS 


$ awk -F\> '/^>/ {if (seqlen != ""){print seqlen}printf("%s - ",$2);seqlen=0;next}seqlen != ""{seqlen +=length($0)}END{print seqlen}' kk2 
1DMLB - 0 
2BHDC - 240 
0
awk -vRS='>' '$1{gsub("[\r]", "",$1); 
       printf "%s - %d\n", $1, length($0) - length($1) - NF + 1}' input 
+0

Pourriez-vous élaborer un peu sur les changements que vous avez faits et comment cela fonctionne pour référence future? –

Questions connexes