Modification de flux avec calcul

Résolu/Fermé
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 3 avril 2014 à 11:29
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 - 3 avril 2014 à 14:35
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.
A voir également:

4 réponses

dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
3 avril 2014 à 13:02
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
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
3 avril 2014 à 14:00
Merci.
Une solution qui me convient, bien que plus obscure que celle de zipe Pour un néophite de awk comme moi.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
3 avril 2014 à 14:29
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
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
3 avril 2014 à 14:35
merci
j'ajouterais que %03d affiche toujours 3 chiffres avec des 0 devant si < 100
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
3 avril 2014 à 11:56
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
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
3 avril 2014 à 12:19
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
3 avril 2014 à 12:26
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
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
3 avril 2014 à 12:49
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