Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 06/02/2021, à 23:36

leloir29

AWK Soustraction valeur d'un champ par celui de la ligne n-1

Bonjour à tous,

Débutant en shell et commençant le awk depuis peu, je ne trouve pas comment soustraire la valeur d'un champ à celui de la ligne n-1. Ceci pour rechercher dans des fichiers extraits d'autres fichiers NetCDF des sauts en arrière de temps dans des trames gps. le séparateur de champ est "espace".

En rouge ci-dessous, on voit que le measureTS[3] est plus petit que measureTS[2]

time[0] 44228.3977939 measureTS[0] 44228.3977893 day since 1899-12-30T00:00:00 UTC
time[1] 44228.3978054 measureTS[1] 44228.3978009 day since 1899-12-30T00:00:00 UTC
time[2] 44228.3978172 measureTS[2] 44228.3978125 day since 1899-12-30T00:00:00 UTC
time[3] 44228.3978287 measureTS[3] 44228.3978041 day since 1899-12-30T00:00:00 UTC
time[4] 44228.3978401 measureTS[4] 44228.3978357 day since 1899-12-30T00:00:00 UTC
time[5] 44228.3978517 measureTS[5] 44228.3978472 day since 1899-12-30T00:00:00 UTC
time[6] 44228.3978633 measureTS[6] 44228.3978588 day since 1899-12-30T00:00:00 UTC

Dans l'idéal, je voudrais donc soustraire et inscrire à chaque fin de ligne le résultat de cette soustraction. les valeurs seulement négatives seront alors recherchées car quelques fois, je peux avoir deux valeurs strictements identiques.

Dans mes rêves les plus fous, je me retrouverai avec un fichier comme celui-ci :

time[0] 44228.3977939 measureTS[0] 44228.3977893 day since 1899-12-30T00:00:00 UTC
time[1] 44228.3978054 measureTS[1] 44228.3978009 day since 1899-12-30T00:00:00 UTC 0.0000116
time[2] 44228.3978172 measureTS[2] 44228.3978125 day since 1899-12-30T00:00:00 UTC 0.0000116
time[3] 44228.3978287 measureTS[3] 44228.3978041 day since 1899-12-30T00:00:00 UTC -0.0000084
time[4] 44228.3978401 measureTS[4] 44228.3978357 day since 1899-12-30T00:00:00 UTC 0.0000316
time[5] 44228.3978517 measureTS[5] 44228.3978472 day since 1899-12-30T00:00:00 UTC 0.0000115
time[6] 44228.3978633 measureTS[6] 44228.3978588 day since 1899-12-30T00:00:00 UTC 0.0000116

La ou les lignes avec les valeurs négatives seraient facilement isolées. J'ai beau fouiller dans pas mal de docs awk, je n'ai rien trouvé... ou compris. hmm

Merci d'avance à ceux qui pourront éclairer ma lanterne. smile

Dernière modification par leloir29 (Le 06/02/2021, à 23:36)

Hors ligne

#2 Le 07/02/2021, à 00:00

Watael

Re : AWK Soustraction valeur d'un champ par celui de la ligne n-1

salut,

à moins d'avoir enregistré la valeur de la ligne n-1 dans une variable, il n'y a pas moyen de remonter dans le fichier.


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#3 Le 07/02/2021, à 03:35

MicP

Re : AWK Soustraction valeur d'un champ par celui de la ligne n-1

Bonjour

michel@xubuT450:~$ gawk '{diff=$4-avant} {if (NR==1) {print $0} else {printf("%s %.7f\n",$0,diff)}}; {avant=$4}'  nomDuFichier
time[0] 44228.3977939 measureTS[0] 44228.3977893 day since 1899-12-30T00:00:00 UTC
time[1] 44228.3978054 measureTS[1] 44228.3978009 day since 1899-12-30T00:00:00 UTC 0.0000116
time[2] 44228.3978172 measureTS[2] 44228.3978125 day since 1899-12-30T00:00:00 UTC 0.0000116
time[3] 44228.3978287 measureTS[3] 44228.3978041 day since 1899-12-30T00:00:00 UTC -0.0000084
time[4] 44228.3978401 measureTS[4] 44228.3978357 day since 1899-12-30T00:00:00 UTC 0.0000316
time[5] 44228.3978517 measureTS[5] 44228.3978472 day since 1899-12-30T00:00:00 UTC 0.0000115
time[6] 44228.3978633 measureTS[6] 44228.3978588 day since 1899-12-30T00:00:00 UTC 0.0000116
michel@xubuT450:~$ 

Dernière modification par MicP (Le 07/02/2021, à 10:56)

Hors ligne

#4 Le 07/02/2021, à 10:55

Hizoka

Re : AWK Soustraction valeur d'un champ par celui de la ligne n-1

Salut, ça réponds pas vraiment à ta demande mais je te propose sans awk :

unset old_TS Resultat
while read -ra line
do
    [[ $old_TS ]] && Resultat=$(echo "${line[3]} - $old_TS" | bc)
    echo "${line[*]} $Resultat"
    old_TS=${line[3]}
done < Fichier

Je trouve ça plus clair, pas besoin de paquet en plus... à toi de voir smile


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#5 Le 07/02/2021, à 15:01

leloir29

Re : AWK Soustraction valeur d'un champ par celui de la ligne n-1

Bonjour,

Merci Watael pour l'astuce de la variable, je ne savais pas. wink

Merci MicP, ta solution est parfaite pour mon traitement suivant.

Enfin merci à Hizoka, ça sera plus portable comme ça.

Vous êtes top. smile

Hors ligne

#6 Le 07/02/2021, à 17:11

MicP

Re : AWK Soustraction valeur d'un champ par celui de la ligne n-1

J'ai changé dans mon message le nom de la commande par gawk
parce que j'avais oublié que j'avais installé le paquetage gawk

Mais en fait, une fois le paquetage gawk installé
le nom de la commande est awk
parce que :

michel@xubuT450:~$ type awk
awk est /usr/bin/awk
michel@xubuT450:~$ file /usr/bin/awk
/usr/bin/awk: symbolic link to /etc/alternatives/awk
michel@xubuT450:~$ file /etc/alternatives/awk
/etc/alternatives/awk: symbolic link to /usr/bin/gawk
michel@xubuT450:~$ file /usr/bin/gawk
/usr/bin/gawk: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=b863ebf57d3cc33d8e7fed3be0e0b5d235489b46, for GNU/Linux 3.2.0, stripped
michel@xubuT450:~$ 

ou en plus court :

michel@xubu:~$ readlink -f $(which awk)
/usr/bin/gawk
michel@xubu:~$ 

Dernière modification par MicP (Le 15/02/2021, à 14:32)

Hors ligne

#7 Le 07/02/2021, à 17:40

Watael

Re : AWK Soustraction valeur d'un champ par celui de la ligne n-1

je ne vois pas de GNUisme dans ton code,
alors que je vois des bashismes dans celui de Hizoka.

donc, niveau portabilité, avantage MicP.

Dernière modification par Watael (Le 07/02/2021, à 17:41)


Connected \o/
Welcome to sHell. · eval is evil.

En ligne