Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Conversion b/s et kb/s en mb/s


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Conversion b/s et kb/s en mb/s
    Bonjour,

    J'essaie de créer un petit script afin de convertir mes débits récupérés en mb/s

    Voici un exemple de mon fichier entrant :
    /tmp/aaa.txt
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    0.00 b/s
    13.50 kb/s
    0.00 b/s
    8.26 kb/s
    0.00 b/s
    12.98 kb/s
    0.00 b/s
    0.00 b/s
    5.14 kb/s
    0.00 b/s
    0.00 b/s
    1.46 mb/s
    0.00 b/s
    2.83 mb/s


    J'ai essayé de passer par une boucle for pour traiter les chiffres et un case pour traiter les unités.

    Cependant cela ne fonctionne pas comme je le souhaiterai, pouvez-vous m'aider svp ?
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    data=$(cat /tmp/aaa.txt | awk '{print $1}')
     
    for element in $data
    do
            units=$(cat /tmp/aaa.txt | awk '{print $2}')
     
            case $units in
                    "b/s")
                            calcul=$(($element / 1024 / 1024))
                            echo "$calcul mb/s"
                            ;;
     
                    "kb/s")
                            calcul=$(($element / 1024))
                            echo "$calcul mb/s"
                            ;;
                    esac
    done

  2. #2
    Expert éminent sénior
    Bonjour

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $ awk 'BEGIN{suiv["b/s"]="kb/s";suiv["kb/s"]="mb/s";} {while ($2 != "mb/s") {$1 /= 1024.0; $2=suiv[$2];}; printf("%.3f %s\n",$1,$2); }' fichier.txt
    0.000 mb/s
    0.013 mb/s
    0.000 mb/s
    0.008 mb/s
    0.000 mb/s
    0.013 mb/s
    0.000 mb/s
    0.000 mb/s
    0.005 mb/s
    0.000 mb/s
    0.000 mb/s
    1.460 mb/s
    0.000 mb/s
    2.830 mb/s
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Modérateur

    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  4. #4
    Expert éminent
    salut,

    une variante, toujours avec awk :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ cat fichier
    1048576.00 b/s
    1024.00 kb/s
    1.00 mb/s


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ awk '
    BEGIN {
       tab["b/s"] = 2
       tab["kb/s"] = 1
       tab["mb/s"] = 0
    }
     
    {
       printf("%.2f %s\t--->\t%.2f mb/s\n", $1, $2, $1/1024^tab[$2])
    }
    ' fichier


    et le résultat :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    1048576.00 b/s  --->    1.00 mb/s
    1024.00 kb/s    --->    1.00 mb/s
    1.00 mb/s       --->    1.00 mb/s

  5. #5
    Expert éminent sénior
    Rappel : bash ne connaît que les nombres entiers. Donc pour des nombres à virgule, il faudra passer par bc, awk, ou autre subterfuge.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  6. #6
    Modérateur

    bc, c'est bien.
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  7. #7
    Membre régulier
    Merci pour toutes vos réponses !

    C'est peut-être pas le plus simple, mais voici comment j'ai procédé :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while read field1 field2; do
            case $field2 in
                   b/s)
                           echo "scale=3;$field1/1024/1024" | bc -l >> /tmp/resultat.txt
                           ;;
                   kb/s)
                           echo "scale=3;$field1/1024" | bc -l >> /tmp/resultat.txt
                           ;;
                   mb/s)
                           echo "$field1" >> /tmp/resultat.txt
                           ;;
                   esac
    done < /tmp/test.txt

  8. #8
    Modérateur

    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  9. #9
    Expert éminent sénior
    Si tu laisses tout en commentaire, ça ne fonctionnera pas...
    Cordialement.

  10. #10
    Modérateur

    spoileur !
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  11. #11
    Membre régulier
    Ahah effectivement

    En tout cas merci pour toutes vos réponses !

  12. #12
    Membre éclairé
    Petite remarque : tu pourrais n'accéder qu'une fois à /tmp/resultat.txt en le sortant de la boucle while :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    while read field1 field2; dodone </tmp/test.txt >/tmp/resultat.txt

    Si le fichier d'entrée grossit un peu, tu verras une différence au niveau du temps de traitement.
    Et puis ça évite d'utiliser >>, car je suppose que tu ne voulais pas que les résultats se concatènent à chaque appel du script (sinon, il faut bel et bien l'utiliser aussi dans la formulation ci-dessus).

###raw>template_hook.ano_emploi###