как я могу посчитать количество букв в каждом разделе - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть такие данные

>sp|Q96A73|P33MX_HUMAN Putative monooxygenase p33MONOX OS=Homo sapiens OX=9606 GN=KIAA1191 PE=1 SV=1
RNDDDDTSVCLGTRQCSWFAGCTNRTWNSSAVPLIGLPNTQDYKWVDRNSGLTWSGNDTCLYSCQNQTKGLLYQLFRNLFCSYGLTEAHGKWRCADASITNDKGHDGHRTPTWWLTGSNLTLSVNNSGLFFLCGNGVYKGFPPKWSGRCGLGYLVPSLTRYLTLNASQITNLRSFIHKVTPHR
>sp|P13674|P4HA1_HUMAN Prolyl 4-hydroxylase subunit alpha-1 OS=Homo sapiens OX=9606 GN=P4HA1 PE=1 SV=2
VECCPNCRGTGMQIRIHQIGPGMVQQIQSVCMECQGHGERISPKDRCKSCNGRKIVREKKILEVHIDKGMKDGQKITFHGEGDQEPGLEPGDIIIVLDQKDHAVFTRRGEDLFMCMDIQLVEALCGFQKPISTLDNRTIVITSHPGQIVKHGDIKCVLNEGMPIYRRPYEKGRLIIEFKVNFPENGFLSPDKLSLLEKLLPERKEVEE
>sp|Q7Z4N8|P4HA3_HUMAN Prolyl 4-hydroxylase subunit alpha-3 OS=Homo sapiens OX=9606 GN=P4HA3 PE=1 SV=1
MTEQMTLRGTLKGHNGWVTQIATTPQFPDMILSASRDKTIIMWKLTRDETNYGIPQRALRGHSHFVSDVVISSDGQFALSGSWDGTLRLWDLTTGTTTRRFVGHTKDVLSVAFSSDNRQIVSGSRDKTIKLWNTLGVCKYTVQDESHSEWVSCVRFSPNSSNPIIVSCGWDKLVKVWNLANCKLK
>sp|P04637|P53_HUMAN Cellular tumor antigen p53 OS=Homo sapiens OX=9606 GN=TP53 PE=1 SV=4
IQVVSRCRLRHTEVLPAEEENDSLGADGTHGAGAMESAAGVLIKLFCVHTKALQDVQIRFQPQL

Я пытаюсь получить число K в каждом разделе, поэтому вывод, который я пытаюсь получить, выглядит следующим образом

         K    R
Q96A73   7    11   
P13674   17   13
Q7Z4N8   11   11
P04637   2    4  

Я пытался сделать это, используя

cat mydata.txt | grep -v '^>' | grep -i -e [k] |wc -l

, например, если мы посмотрим на первый

          K    R    KK   RR
Q96A73   7    11    0      0
P13674   17   13    1     2
Q7Z4N8   11   11    1     0
P04637   2    4     0     0

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Использование Perl,

 perl -F"\|" -lne ' BEGIN{print "ID   K R"} s/(K|R)/$kv{$1}++/ge; if(not /^>/ ) { print "$x $kv{K} $kv{R}" ;%kv=() } $x=$F[1] '

со входами

$ cat KR.txt
>sp|Q96A73|P33MX_HUMAN Putative monooxygenase p33MONOX OS=Homo sapiens OX=9606 GN=KIAA1191 PE=1 SV=1
RNDDDDTSVCLGTRQCSWFAGCTNRTWNSSAVPLIGLPNTQDYKWVDRNSGLTWSGNDTCLYSCQNQTKGLLYQLFRNLFCSYGLTEAHGKWRCADASITNDKGHDGHRTPTWWLTGSNLTLSVNNSGLFFLCGNGVYKGFPPKWSGRCGLGYLVPSLTRYLTLNASQITNLRSFIHKVTPHR
>sp|P13674|P4HA1_HUMAN Prolyl 4-hydroxylase subunit alpha-1 OS=Homo sapiens OX=9606 GN=P4HA1 PE=1 SV=2
VECCPNCRGTGMQIRIHQIGPGMVQQIQSVCMECQGHGERISPKDRCKSCNGRKIVREKKILEVHIDKGMKDGQKITFHGEGDQEPGLEPGDIIIVLDQKDHAVFTRRGEDLFMCMDIQLVEALCGFQKPISTLDNRTIVITSHPGQIVKHGDIKCVLNEGMPIYRRPYEKGRLIIEFKVNFPENGFLSPDKLSLLEKLLPERKEVEE
>sp|Q7Z4N8|P4HA3_HUMAN Prolyl 4-hydroxylase subunit alpha-3 OS=Homo sapiens OX=9606 GN=P4HA3 PE=1 SV=1
MTEQMTLRGTLKGHNGWVTQIATTPQFPDMILSASRDKTIIMWKLTRDETNYGIPQRALRGHSHFVSDVVISSDGQFALSGSWDGTLRLWDLTTGTTTRRFVGHTKDVLSVAFSSDNRQIVSGSRDKTIKLWNTLGVCKYTVQDESHSEWVSCVRFSPNSSNPIIVSCGWDKLVKVWNLANCKLK
>sp|P04637|P53_HUMAN Cellular tumor antigen p53 OS=Homo sapiens OX=9606 GN=TP53 PE=1 SV=4
IQVVSRCRLRHTEVLPAEEENDSLGADGTHGAGAMESAAGVLIKLFCVHTKALQDVQIRFQPQL

$  perl -F"\|" -lne ' BEGIN{print "ID   K R"} s/(K|R)/$kv{$1}++/ge; if(not /^>/ ) { print "$x $kv{K} $kv{R}" ;%kv=() } $x=$F[1] ' KR.txt
ID   K R
Q96A73 8 11
P13674 17 13
Q7Z4N8 11 11
P04637 2 4

$

ОП обновил вопрос .. Просьба проверить сейчас

$  perl -F"\|" -lne ' BEGIN{print "ID   K R"} if(not /^>/) { s/(K|R)/$kv{$1}++;$1/ge;s/(KK|RR)/$kv{$1}++/ige; print "$x $kv{K} $kv{R} ",$kv{KK}?$kv{KK}:0," ",$kv{RR}?$
kv{RR}:0 ;%kv=() } $x=$F[1] ' KR.txt
ID   K R
Q96A73 7 11 0 0
P13674 17 13 1 2
Q7Z4N8 11 11 0 1
P04637 2 4 0 0

$
0 голосов
/ 12 февраля 2019
$ awk '
    BEGIN { FS="|"; OFS="\t"; print "", "K", "R", "KK", "RR" }
    /^>/ { v=$2; next }
    { print v, gsub(/[kK]/,"&"), gsub(/[rR]/,"&"), gsub(/[kK]{2}/,"&"), gsub(/[rR]{2}/,"&") }
' file
        K       R       KK      RR
Q96A73  7       11      0       0
P13674  17      13      1       2
Q7Z4N8  11      11      0       1
P04637  2       4       0       0
0 голосов
/ 12 февраля 2019

Не могли бы вы попробовать следующее.

awk -F'|' '/^>/{val=$2;next} {print val,gsub(/[kK]/,""),gsub(/[rR]/,"")}' Input_file


Если вы хотите получить вывод заголовков тоже, попробуйте следующее.

awk -F'|' 'BEGIN{print "       K R"}/^>/{val=$2;next} {print val,gsub(/[kK]/,""),gsub(/[rR]/,"")}'  Input_file


EDT1: В соответствии с комментарием ОП в случае, если мы хотим получить счет 2 непрерывных вхождений KK или kk, затем попробуйте выполнить следующее.

awk -F'|' '/^>/{val=$2;next} {print val,gsub(/kk|KK/,""),gsub(/rr|RR/,"")}' Input_file


РЕДАКТИРОВАТЬ 2: Чтобы получить k, kk, r, rr, используйте следующие.

awk -F'|' '/^>/{val=$2;next} {line=$0;print val,gsub(/[kK]/,""),gsub(/[rR]/,""),gsub(/kk|KK/,"",line),gsub(/rr|RR/,"",line)}' Input_file

С заголовками:

awk -F'|' '
BEGIN{
  print "       k/K\tr/R\tkk/KK\trr/RR"
}
/^>/{
  val=$2
  next
}
{
  line=$0
  print val,gsub(/[kK]/,""),gsub(/[rR]/,""),gsub(/kk|KK/,"",line),gsub(/rr|RR/,"",line)
}' OFS="\t"   Input_file

Вывод будет следующим.

       k/K      r/R     kk/KK   rr/RR
Q96A73  7       11      0       0
P13674  17      13      1       2
Q7Z4N8  11      11      0       1
P04637  2       4       0       0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...