Modification de flux avec calcul

Résolu
Bonjour,
voila, j'ai un flux de texte (produit avec un outils genre cat, cuebreakpoints pour être précis) qui me sort du texte sous la forme :
[m]m:ss:ff
que je voudrais transformer avec une commande comme sed ou awk en
[m]m:ss:nnn
avec la relation nnn=(ff/75)*1000.
Je vois différentes solutions en script shell, mais pas sur un flux.
--
La vrai soumission c'est quand les esclaves s'inquiètent du cours du coton.
Char Snipeur

4 réponses

  1. hello
    me voilou
    avec un flux à la place du echo, awk traitera chaque ligne qui arrive
    $ echo 3:12.0 | awk -F "[:.]" '{print $1 ":" $2 "." sprintf("%03d", $3*1000/75)}'
    3:12.000
    1
    1. Contributeur
      Merci.
      Une solution qui me convient, bien que plus obscure que celle de zipe Pour un néophite de awk comme moi.
      0
    2. Contributeur
      Apparemment rien de bien compliqué.

      -F "[:.]" 
      Il définit 2 séparateurs de champs différents (deux points et point). Ce qui nous donne 3 champs pour chaque ligne.

      print $1 ":" $2 "."
      Il imprime les 2 premiers champs tels qu'ils sont, en remettant le séparateur deux points entre les deux et le point en fin.

      sprintf("%03d", $3*1000/75)
      Puis il imprime le dernier champs en le mettant en forme directement grâce à la directive sprintf.

      Comme dubcek connaît parfaitement toutes les subtilités de
      awk
      à l'inverse de bibi, c'est quand même beaucoup plus concis et précis ;-))
      0
    3. merci
      j'ajouterais que %03d affiche toujours 3 chiffres avec des 0 devant si < 100
      0
  2. Contributeur
    Salut,

    En espérant avoir tout compris de ton problème...

    Ce fichier :

    $ cat plop 
    1:22:120
    23:45:565
    54:10:963

    Lu ligne par ligne depuis le
    shell
    avec une temporisation de 3 secondes, pipé via
    awk
    me sort :

    $ while read line;do echo ${line};sleep 3;done < plop  | awk 'BEGIN{FS=OFS=":"} {var=($3/75)*1000 } gsub($3, var,$3) { print }'
    1:22:1600
    23:45:7533.33
    54:10:12840

    C'est ça que tu veux ?

    0
    1. Contributeur
      Salut, merci zipe, c'est presque ça. Le premier fichier se fini par 2 caractère (entre 0 et 74) et je doit ressortir un entier sur 3 caractère.
      La bonne opération entière n'est pas celle que j'ai donnée, mais ff*1000/75.
      Par contre, erreur de ma part, c'est [m]m:ss.ff le format
      Je vois grosso modo comment modifier awk, sauf pour lui demander de respecter les 3 caractères pour l'affichage.
      Par exemple, il faut transformer 3:12.00 en 3:12.000.

      Question général : On est obligé de passer par le while, awk ne fonctionne pas en flux comme sed ?
      0
      1. Contributeur
        Je vois grosso modo comment modifier awk, sauf pour lui demander de respecter les 3 caractères pour l'affichage.
        Euh... là on va attendre dubcek, le spécialiste awk par excellence. Ma connaissance de awk est trop sommaire pour ça, désolé ;-(

        Question général : On est obligé de passer par le while, awk ne fonctionne pas en flux comme sed ?
        J'ai utilisé une boucle
        while
        juste pour simuler un flux continu. Pas de souci pour un emploi normal ;-))
        0
    2. Contributeur
      En effet, pas besoin du while.
      J'ai trouver par hasard la fonction permettant de faire ce que je voulais. Au final la commande awk donne :
      awk 'BEGIN{FS=OFS="."} {var=$2*1000/75 } gsub($2, sprintf("%.3d",var),$3) { print }'

      Encore merci zipe.
      Par contre, ça ne résoud pas mon problème de split. Mais ceci est un autre sujet.
      0