Modification de flux avec calcul

Résolu
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   -  
dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   -
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. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      Merci.
      Une solution qui me convient, bien que plus obscure que celle de zipe Pour un néophite de awk comme moi.
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      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. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      merci
      j'ajouterais que %03d affiche toujours 3 chiffres avec des 0 devant si < 100
      0
  2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    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
  3. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    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. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      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
  4. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    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