0
votes

Comment puis-je compter le nombre d'une lettre dans chaque section

J'ai une donnée comme celle-ci xxx pré>

J'essaie d'obtenir le nombre de K dans chaque section, la sortie que j'essaie d'obtenir est comme celle-ci p>

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


1 commentaires

Je crois (en voyant votre tentative), vous ne voulez pas considérer la ligne qui commence à partir de > , pouvez-vous confirmer que votre dernier instruction n'est pas clair. "


3 Réponses :


1
votes

Pourriez-vous s'il vous plaît essayer suivre. XXX PRE>



Si vous souhaitez obtenir la sortie des en-têtes, essayez ensuite de suivre. P>

       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


10 commentaires

Et si je veux calculer le nombre de kk (signifie que ceux qui sont k sont proches de k?) Je me demande simplement si j'utilise votre commandement, vais-je toujours pouvoir identifier ceux-ci?


@Learner, bien sûr, changez gsub (..) mentionné ci-dessus sur gsub (/ kk | kk /, "") et faites le moi savoir. Il devrait prendre soin de SmallL kk et capital kk .


Non, je voulais dire compter ceux qui n'ont que deux kk à côté de l'autre, devrais-je faire cela? awk -f '|' '/ ^> / {val = 2 $; suivant} {imprimé Val, gsub (/ [kk] /, ""), gsub (/ [rr] /, ""), gsub (/ [kk] /, "" )} 'INPUT_FILE ??


@Learner, oui, utilisez ensuite un awk -f '|' '/ ^> / {val = 2 $; suivant} {imprimé Val, gsub (/ kk | kk /, ""), gsub (/ rr | rr /, "")}' INPUT_FILE ET LE PASSEZ-MOI PENDANT ?


Cela me donne zéro, j'ai collé les résultats de la sortie comment il devrait être ci-dessus, j'apprécie vraiment votre guide


@Learner, s'il vous plaît essayez mon édition2 et laissez-moi savoir alors?


Cela me donne 1AWK: erreur de syntaxe à la ligne source 1 i` Qu'est-ce qui pourrait être le problème?


@Learner, Edit2 et Edit2: Avec les en-têtes: Les deux fonctionnent bien pour moi, vérifiez une fois et laissez-moi savoir? Je ne sais pas si c'était copié correctement?


Quoi qu'il en soit, vous avez passé tellement de temps bien que cela ne le résoudra pas, j'ai aimé et accepté votre réponse. Merci pour votre temps, je vais en lire demain


@Learner, s'il vous plaît élaborer plus ce qui ne fonctionne pas? Une solution devrait fonctionner sur un ensemble de données petit ou grand, laissez-moi savoir de même chose.



2
votes

Utilisation de PERL,

$  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 commentaires

2
votes
$ 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

3 commentaires

Pour être très honnête, j'ai aussi pensé la même chose :) ne pouvait pas l'ajouter mais. Merci d'avoir ajouté Sir ++ VE


@Ed Morton Je souhaite que tu sois mon professeur ;-) Comment puis-je apprendre à coder comme toi? J'ai déjà aimé votre réponse


Dans chaque situation, gardez toutes vos conditions positives et tout le code simple. Au-delà de cela, il suffit de rester sur les bases absolues de la cohésion serrée et du couplage desserré et le repos est de la sauce.