Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1727 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  {awk} comparaison entre deux lignes

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

{awk} comparaison entre deux lignes

n°1373260
raphy75
Posté le 07-02-2015 à 20:10:17  profilanswer
 

Bonjour a tous :)
 
Je viens vers vous pour demander des conseils sur un script en shell que je suis en train de terminer, enfin j'espere pouvoir le terminer. Je n'ai pas de clavier azerty donc dsl pour les accents...
 
Je decouvre la puissance de la commande awk et j'aime beaucoup. Mais je me heurte a un probleme. Je vous explique. J'ai un fichier texte qui contient des lignes et apres nettoyage j'arrive a ce resultat (je passe les formules et grep etc... le fichier texte est lu par awk mais pas mis ici, la ligne est tres longue) mais en gros mon dernier awk est le suivant ainsi que la sortie :
 
awk '{print NR " " $1 " " $2 " " $3}'
 
1 1 1 48.2872
2 1 2 47.2672
3 1 3 48.2552
4 1 4 47.2872
5 1 5 48.2962
6 1 6 48.2122
7 1 7 46.2252
8 1 8 48.0365
9 1 9 48.2212
 
Ce qui devient $1 $2 $3 $4 (1 1 1 48.2872) etc...
 
$1 est le NR du awk au dessus
$2 varie consecutivement de 1 a 16.
$3 varie consecutivement de 1 a 480 et se repete 16 fois.
 
Il y a donc 16*480 soit 7680 lignes a lire donc NR varie de 1 a 7680 (j'ai juste mis 9 ligne au dessus :).
 
Mon but est de comparer les valeurs de la sortie $4, les 48.2872, 47.2672 etc...
 
C'est a dire comme ca (traduction de ce qui se passe dans ma tete) :
 
if ($1==($3 + 1)) ET (ABS(48.2872 - 47.2672)) > 6) then print la sortie $2 $3 $4 de la ligne.
 
Le 6 est ma limite (en dB), est-ce possible de comparer de la ligne 1 a la ligne 7680 ?
 
J'ai essaye un truc du style :
 
awk '{print NR " " $1 " " $2 " " $3}' | awk '(NR==($3+1)) {print $4}'
 
Mais je n'arrive pas a trouver la suite, voir de savoir si c'est possible sans passer par une autre alternative ? De plus, meme si ca marche, est-il possible de s'arreter a la ligne 7680 et de demander a comparer $4 avec celui de la ligne precedente ?
 
J'espere que j'ai reussi a me faire comprendre, pas facile :)
 
Merci d'avance pour vos reponses :)
 
A+
 
raph
 

mood
Publicité
Posté le 07-02-2015 à 20:10:17  profilanswer
 

n°1373261
Profil sup​primé
Posté le 07-02-2015 à 21:05:17  answer
 

salut,
 

Citation :

Je decouvre la puissance de la commande awk

et tu n'as pas fini : les «formules et grep» sont très probablement inutiles, car `awk' peut sûrement le faire.
et quand je dis `awk', je veux dire un seul `awk' (pas un `awk | awk') !
 
ce que tu veux faire (ce que j'ai compris) est tout aussi probablement possible en utilisant un tableau, dont le contenu sera exploité après la lecture du fichier (dans `END{...}').

n°1373262
raphy75
Posté le 08-02-2015 à 00:10:50  profilanswer
 

Salut,
 
Merci pour ta reponse :)
 
Pourrais-tu expliquer comment faire avec BEGIN et END car j'ai essaye sans y arriver... Franchement je suis vraiment bloque :cry:  
 
Je n'arrive pas a comprendre comment, sur une ligne en cours, lire le $4 de la ligne suivante et faire une comparaison avec la ligne en cours, avec un if etc... Le tout avec un awk...


---------------
I am a freak, I am unique.
n°1373276
Profil sup​primé
Posté le 08-02-2015 à 15:46:31  answer
 

tu dois conserver le $4 de la ligne précédente dans une variable (et non tenter de lire la ligne suivante), et donc comparer la variable de la ligne précédente avec la ligne courante.
 
voici un exemple d'utilisation d'un tableau simple rempli pendant la lecture du fichier, et exploité après:

Code :
  1. echo "a
  2. b
  3. c
  4. d
  5. e
  6. f" | awk '{ar[++n]=$1}END{for (i=1;i<=length(ar);i++)print "ar["i"] = "ar[i]}'
  7. ar[1] = a
  8. ar[2] = b
  9. ar[3] = c
  10. ar[4] = d
  11. ar[5] = e
  12. ar[6] = f

n°1373286
raphy75
Posté le 09-02-2015 à 02:18:55  profilanswer
 

Merci pour ta reponse,
 
Je vois un peu le truc, mais pas le bout...
Je prends ton exemple et je vais voir si j'arrive a l'exploiter :)

n°1373287
raphy75
Posté le 09-02-2015 à 05:38:32  profilanswer
 

J'ai fait un petit test en utilisant ton conseil :
 
previous awk with input | awk '{ar[++n]=($1 " " $2 " " $3)}END{for (i=1;i<=length(ar);i++)print "ar["i"] = "ar[i]}'
 
J'obtient la sortie suivante :
 
ar[1] = 1 1 -180
ar[2] = 1 2 48.3021
ar[3] = 1 3 48.1691
ar[4] = 1 4 48.1502
ar[5] = 1 5 40.0047
ar[6] = 1 6 48.1237
ar[7] = 1 7 48.1048
ar[8] = 1 8 48.015
ar[9] = 1 9 48.0646
ar[10] = 1 10 47.9472
ar[11] = 1 11 47.8469
ar[12] = 1 12 47.8212
ar[13] = 1 13 47.8616
ar[14] = 1 14 47.8047
 
En gros la meme chose mais avec ar, c'est grace a ca que je peu checker differentes lignes?
Cependant je ne capte toujours pas comment comparer des valeurs entre deux lignes... Ce qui m'interesse est le dernier $, et de pouvoir le comparer avec le meme $ de la ligne soit suivante, soit precedente... La je bloque  :cry:

n°1373288
Profil sup​primé
Posté le 09-02-2015 à 07:18:44  answer
 

je ne peux pas t'aider comme ça.
j'ai besoin d'un extrait représentatif de l'entrée originale, et la sortie attendue correspondante, ainsi que le raisonnement qui a conduit à cette sortie.
 
comme je te l'ai dit, une seule instance de awk peu probablement tout faire.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  {awk} comparaison entre deux lignes

 

Sujets relatifs
{awk} comparaison entre deux lignesCherche logiciel de comparaison de fichier mode bloc - rdiff!
Remplacer plusieurs lignes par un seul ";" dans un fichier[sed] supprimer \n sur un nombre indéterminé de lignes consécutives
concaténation de lignes de fichiers[Shell] Comparaison de dates entre deux fichiers
Afficher contenu lignes de fichiers avec critèreshelp SVP sur vim: comparer 2 fichiers et enlever lignes doublonnées
Trouver les lignes ds un fichier dont un champs est ds un autre 
Plus de sujets relatifs à : {awk} comparaison entre deux lignes


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR