Script bash pour réaliser un calcul toute les 51 lignes
Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

Script bash pour réaliser un calcul toute les 51 lignes



  1. #1
    Oceane666

    Script bash pour réaliser un calcul toute les 51 lignes


    ------

    Bonjour à tous !

    Je possède fichier nommé : methylation_extracted_downstre am.bed
    Avec ce type de données :
    contig_1 21914 21915 0 0 0
    contig_1 21915 21916 0 0 0
    contig_1 21916 21917 12 7 132
    contig_1 21917 21918 0 0 0
    contig_1 21918 21919 0 0 0
    contig_1 21919 21920 0 0 0
    contig_1 21920 21921 0 0 0
    contig_1 21921 21922 0 0 0
    contig_1 21922 21923 0 0 0
    contig_1 21923 21924 0 0 0
    contig_1 21924 21925 0 0 0
    contig_1 21925 21926 0 0 0
    contig_1 21926 21927 0 0 0
    contig_1 21927 21928 0 0 0
    contig_1 21928 21929 0 0 0
    contig_1 21929 21930 0 0 0
    contig_1 21930 21931 0 0 0
    contig_1 21931 21932 0 0 0
    contig_1 21932 21933 0 0 0
    contig_1 21933 21934 0 0 0
    contig_1 21934 21935 0 0 0
    contig_1 21935 21936 0 0 0
    contig_1 21936 21937 0 0 0
    contig_1 21937 21938 0 0 0
    contig_1 21938 21939 0 0 0
    contig_1 21939 21940 0 0 0
    contig_1 21940 21941 0 0 0
    contig_1 21941 21942 0 0 0
    contig_1 21942 21943 0 0 0
    contig_1 21943 21944 13 22 105
    contig_1 21944 21945 0 0 0
    contig_1 21945 21946 0 0 0
    contig_1 21946 21947 0 0 0
    contig_1 21947 21948 0 0 0
    contig_1 21948 21949 0 0 0
    contig_1 21949 21950 0 0 0
    contig_1 21950 21951 0 0 0
    contig_1 21951 21952 0 0 0
    contig_1 21952 21953 0 0 0
    contig_1 21953 21954 0 0 0
    contig_1 21954 21955 0 0 0
    contig_1 21955 21956 0 0 0
    contig_1 21956 21957 0 0 0
    contig_1 21957 21958 0 0 0
    contig_1 21958 21959 0 0 0
    contig_1 21959 21960 0 0 0
    contig_1 21960 21961 0 0 0
    contig_1 21961 21962 13 6 134
    contig_1 21962 21963 0 0 0
    contig_1 21963 21964 0 0 0
    contig_1 21964 21965 0 0 0

    En utilisant bash j'aimerai créer un tableau qui stocke toute les 51 lignes la valeur obtenu du calcul suivant : somme des valeurs de la colonne 4 / (somme des valeur de la colonne 4 + somme des valeurs de la colonne 5 + somme des valeurs de la colonne 6).
    J'aimerai aussi mettre une autre colonne en première position qui met le span (la position de départ et de fin) donc par example dans l'example que j'ai donnée ce serait de 21914-21964 et mettre en deuxième colonne la valeur du calcul.

    Merci d'avance pour votre aide, je suis un peu nouvelle en bioinformatique et je ne m'y connais pas trop toute aide sera bienvenue

    -----

  2. #2
    micapivi

    Re : Script bash pour réaliser un calcul toute les 51 lignes

    Bonjour

    J'ai essayé de n'utiliser que les fonctionnalités de bash, mais j'ai quand même utilisé bc pour faire la division.

    Code:
    #!/bin/bash
    
    [[ $# -eq 0 ]] && { echo "Donnez le nom du fichier à traiter"; exit; }
    
    nblignes=51
    nbrDecimales=16  # pour la division
    cmptLignes=0
    depart=0
    fin=0
    total4=0
    total5=0
    total6=0
    
    while read champ1 champ2 champ3 champ4 champ5 champ6; do 
      (( cmptLignes += 1 ))
      (( depart == 0 )) && depart=$champ2
      (( total4 += champ4 ))
      (( total5 += champ5 ))
      (( total6 += champ6 ))
      fin=$champ2
      (( cmptLignes >= nblignes )) && {
        echo $depart $fin $( bc <<< "scale=$nbrDecimales; $total4 / ( $total4 + $total5 + $total6 )" )
        depart=0
        fin=0
        cmptLignes=0
        total4=0
        total5=0
        total6=0
      }
    done  < "$1"
    Ce qui donne, avec un fichier de 51 lignes minimum :
    Code:
    mic@deb12:~$ ./testScript.sh fichier
    21914 21964 .0855855855855855
    mic@deb12:~$
    Dernière modification par micapivi ; 27/05/2024 à 12h56.

  3. #3
    polo974

    Re : Script bash pour réaliser un calcul toute les 51 lignes

    Bonjour,
    En fait, bash ne sait pas faire d'opérations flottantes.

    Pourquoi cette contrainte?
    N'y a-t-il pas un langage plus adapté disponible sur la machine?

    (on peut remplacer bc par plein d'autre programmes donnant accès aux flottants, mais autant en prendre un, genre python et tout faire avec, ce sera bien plus lisible et formateur)
    Jusqu'ici tout va bien...

  4. #4
    Henrix

    Re : Script bash pour réaliser un calcul toute les 51 lignes

    Quel est le nombre de lignes maximum de tes fichiers ?

  5. A voir en vidéo sur Futura
  6. #5
    pm42

    Re : Script bash pour réaliser un calcul toute les 51 lignes

    Une ligne :
    Code:
    awk '{s4+=$4; s5+=$5; s6+=$6; if(NR%51==1) {start = $2 }; if(NR%51==0) { end=$3; printf("%f %s-%s\n", s4/(s4+s5+s6), start, end) } }' methylation_extracted_downstre am.bed

  7. #6
    micapivi

    Re : Script bash pour réaliser un calcul toute les 51 lignes

    avec le script bash que je t'ai proposé, la sortie se présentera comme ça :
    Code:
    21914 21964 .0855855855855855
    mais si tu veux qu'un tiret sépare les deux champs comme ça :
    Code:
    21914-21964 .0855855855855855
    il te faudra remplacer dans le script :
    Code:
      echo $depart $fin
    par :
    Code:
      echo $depart-$fin
    =======================
    D'autre part, s'il y a une ou plusieurs espace dans le nom de ton fichier, comme par exemple :
    Code:
    methylation_extracted_downstre am.bed
    dans la ligne de commande, il te faudra mettre ce nom de fichier entre des doubles guillements :
    Code:
    "methylation_extracted_downstre am.bed"

  8. #7
    pm42

    Re : Script bash pour réaliser un calcul toute les 51 lignes

    Citation Envoyé par pm42 Voir le message
    Une ligne :
    Code:
    awk '{s4+=$4; s5+=$5; s6+=$6; if(NR%51==1) {start = $2 }; if(NR%51==0) { end=$3; printf("%f %s-%s\n", s4/(s4+s5+s6), start, end) } }' methylation_extracted_downstre am.bed
    Petite correction pour remettre les variables de somme à 0 toutes les 51 lignes.

    Code:
    awk '{s4+=$4; s5+=$5; s6+=$6; if(NR%51==1) {start = $2 }; if(NR%51==0) { end=$3; printf("%f %s-%s\n", s4/(s4+s5+s6), start, end); s4=0;s5=0;s6=0 } }' methylation_extracted_downstre am.bed

  9. #8
    polo974

    Re : Script bash pour réaliser un calcul toute les 51 lignes

    awk != bash

    Ah, mais...

    Allez, il y a quelqu'un pour le faire en cobol?

    (C'est vachement recherché comme compétence...)
    Jusqu'ici tout va bien...

  10. #9
    pm42

    Re : Script bash pour réaliser un calcul toute les 51 lignes

    Citation Envoyé par polo974 Voir le message
    awk != bash
    Ca se discute et dans ce cas, bc != bash

    L'intérêt du shell, c'est quand même justement toutes les commandes faites pour être utilisées dedans.
    Et là, c'est du simple : pas de | , de ``, xargs et autres.

    Qui plus est, awk est justement conçu pour ça : séparer des colonnes, faire des calculs dessus, etc.

  11. #10
    Henrix

    Re : Script bash pour réaliser un calcul toute les 51 lignes

    Mes deux cent's (pour Windows et pour le fun)
    J'ai ajouté des données pour tester
    Remplacer les données dans le fichier: "données.txt"
    Lien 14 jours: https://www.mediafire.com/file/jnwea...1+102.zip/file

  12. #11
    micapivi

    Re : Script bash pour réaliser un calcul toute les 51 lignes

    Une erreur dans mon script,
    il faudrait remplacer :
    Code:
      fin=$champ2
    par :
    Code:
      fin=$champ3

  13. #12
    Oceane666

    Re : Script bash pour réaliser un calcul toute les 51 lignes

    Merci beaucoup pour votre aide, j'ai utilisé la commande de pm42 qui marche parfaitement.

  14. #13
    micapivi

    Re : Script bash pour réaliser un calcul toute les 51 lignes

    Avec awk au lieu de bc on y perd un peu en précision,
    mais bon, c'est peut-être pas si important que ça pour ce que tu comptes faire :
    Code:
    mic@deb12:~$ awk 'BEGIN{ printf "%.20f\n",1/3}'
    0.33333333333333331483
    mic@deb12:~$ 
    mic@deb12:~$ echo 'scale=20; 1/3' | bc
    .33333333333333333333
    mic@deb12:~$

  15. #14
    polo974

    Re : Script bash pour réaliser un calcul toute les 51 lignes

    Citation Envoyé par micapivi Voir le message
    Avec awk au lieu de bc on y perd un peu en précision,
    mais bon, c'est peut-être pas si important que ça pour ce que tu comptes faire :
    Ben oui, bc est une calculette base 10 de précision arbitraire...

    Mais awk (version gnu) fait (4 fois) mieux que du double, il faut juste bien lui parler (positionner la variable PREC).

    Sinon en python, il y la lib decimal qui permet aussi de la précision arbitraire en base 10, mais il faut vraiment en avoir besoin vu le coût en terme de perf et que (sauf erreur) ça ferme la porte à numpy et du coup, sans doute aussi à pandas qui l'utilise.
    Jusqu'ici tout va bien...

  16. #15
    pm42

    Re : Script bash pour réaliser un calcul toute les 51 lignes

    On peut aussi préciser qu'il n'y a pas des masses de domaine en science où on a besoin de plus de précision ce qu'un float ou un double donne.

    Un float c'est déjà la mesure d'une tonne au gramme prêt.
    Les choses sont plus pointues quand on fait du calcul numérique plus massif, des matrices avec des valeurs extrêmes mais dans l'exemple donné vu qu'on calcule des moyennes de 51 nombres entiers pas très grands, la question ne sd pose même pas.

Discussions similaires

  1. Script Bash pour extraire des séquences fasta
    Par Oceane666 dans le forum Programmation et langages, Algorithmique
    Réponses: 10
    Dernier message: 22/05/2024, 18h02
  2. Quel calcul faire pour réaliser un électroaimant ?
    Par MatEA57 dans le forum Électronique
    Réponses: 0
    Dernier message: 13/05/2011, 13h06
  3. Calcul de lignes
    Par invitea18c9f4c dans le forum Électronique
    Réponses: 4
    Dernier message: 07/12/2010, 21h09
  4. Calcul des lignes trigonométriques de 3pi/8
    Par invitede9878e9 dans le forum Mathématiques du collège et du lycée
    Réponses: 4
    Dernier message: 29/11/2009, 11h00
  5. script JS pour calcul de résistances
    Par invitee17aeca5 dans le forum Électronique
    Réponses: 18
    Dernier message: 14/09/2005, 12h42