Awk-perl

Résolu/Fermé
karim_khouja Messages postés 50 Date d'inscription lundi 6 avril 2009 Statut Membre Dernière intervention 16 février 2010 - 6 avril 2009 à 16:20
karim_khouja Messages postés 50 Date d'inscription lundi 6 avril 2009 Statut Membre Dernière intervention 16 février 2010 - 6 mai 2009 à 16:54
Bonjour,
j'ai un fichier hexadécimal le séparateur de chaque mot hexa et "|"
je voulais extraire des mots specifiques

en fait, c'est fichier tres long qui ressemble a celui de Wireshark l'or d'un enregistrement *.txt

je voulais tester $44

cat /home/../Bureau/hexa.txt | awk -F| `BEGIN {NR=4; int Nseq=0;int num=0;}
{

if( $44!="60")
{num = NR; Nseq =strcat($45,$46); NR=NR+32;}

else
{num = NR; NR=NR+33;}
}
END {print num " " Nseq}`>>/home/../Bureau/rtp.txt

ce code je veux l'introduire dans le script perl
puis-je le faire et comment ?
y a t-il des fautes dans ce bout de code svp?
merci bcp
A voir également:

75 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
8 avril 2009 à 13:31
Re,

Ce ne sont pas des messages d'erreurs, mais de warnings.
Pourquoi?
Puisque le code que tu essaies ne s'applique pas de la même façon pour toutes les lignes.
De mon côté je ne peux rien faire, puisque je n'ai pas le même environnement que toi.

Déjà pour ajouter plusieurs éléments à un tableau on utilise push ou unshift

Il suffit de faire un truc de genre
open FILE,"/home/sst/Bureau/rtp.txt" or die "E/S : $!\n"; 


while( defined( $line = <FILE> ) ) 
{ 
  $line =~/^\w+\s(\w+)\s\w+\s(\w+)/; # espace comme séparateur
  push @table, $2 if $1=60;
}
--
106485010510997108
0
karim_khouja Messages postés 50 Date d'inscription lundi 6 avril 2009 Statut Membre Dernière intervention 16 février 2010 3
8 avril 2009 à 15:24
toujours pas solution

j'ai essayer de faire tester si le tableau contien des valeurs ou non
mais sans resultats, je me tombe en panne vraiment j'ai pas compris pourquoi il n'accepte pas tous les essais

$line =~/^\w+\s(\w+)\s\w+\s(\w+)/;
push (my @table, $4 ) if $2 eq '60';
print "@table\n";


$line =~/^\w+\s(\w+)\s\w+\s(\w+)/;
push (my @table, $4 ) if $2 eq '60';
print "my $table[1]\n";

svp c tres urgent Mr,
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
8 avril 2009 à 15:29
Re,

Envoie ton code et ton fichier complet sur lequel tu fait les tests.
Si confidentiel tu peut mettre les liens cjoint par MP.
Tu n'as toujours pas dit.
Les fichiers viens d'windows?

Je vais regarder ce soir.
0
karim_khouja Messages postés 50 Date d'inscription lundi 6 avril 2009 Statut Membre Dernière intervention 16 février 2010 3
8 avril 2009 à 15:55
malheuresement si tu peux m'envoyer ton mail c'est mieux que tu vois le fichier tel qu'il est
car cjoint ne l'affiche pas comme il est

a propos le fichier est ouvert sous linux
0
karim_khouja Messages postés 50 Date d'inscription lundi 6 avril 2009 Statut Membre Dernière intervention 16 février 2010 3
8 avril 2009 à 16:01
c'est le fichier initial que j'ai fais l'extraction de donnée avec succés

https://www.cjoint.com/?ekfzFr1raU

et celui ci est le second que je vais l'analyser pour faire :
1-) inserer tous les SNBL dans un tableau lorseque $2=='60'
2-) le contenue de ce tableau est en hexadecimal je vais le convertir en decimal
3-) distinguer un saut de 33 entre les SNBL c'est a dire comparer le contenu du tableau 2 à 2 si difference = 33 mettre dans une variable le $SNBL (qui est $4 comme je t'ai dis avant)

https://www.cjoint.com/?ekfIrSOo3q


et cela mon code complet sans l'interface graphique en PERL-GTK2

# !/usr/bin/perl -w

use strict;
use warnings;


open LIRE,"/home/sst/Bureau/karim/capture/louati.txt" or die "fichier in trouvable";
open ECRIRE,">/home/sst/Bureau/rtp.txt\n", or die "E/S : $!\n";

while(<LIRE>)
{
if($. % 4 == 3)
{
my ($data_135,$data_136, $data_138, $data_139, $data_141, $data_142, $data_168, $data_169, $data_171, $data_172) = (split /|/,$_)[135, 136, 138, 139, 141, 142, 168, 169, 171, 172];
print ECRIRE "ligne$. \t $data_135$data_136 $data_138$data_139$data_141$data_142 $data_168$data_169$data_171$data_172 \n";
}
#close (LIRE);

open FILE,"/home/sst/Bureau/rtp.txt" or die "E/S : $!\n";

my $table='';
while( defined( my $line = <FILE> ) )
{
$line =~/^\w+\s(\w+)\s\w+\s(\w+)/; # espace comme séparateur
push (my @table, $4 ) if $2 eq '60';
print "@table\n";
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
8 avril 2009 à 17:00
Re,

Oups, je n'ai pas remarqué avant de voir le résultat.
Vu que le séparateur est | je me suis demandé pourquoi tu es obligé d'avoir 10 variables au lieu de 5
En fait au lieu de
split /|/

Il faut mettre
split /\|/
En ce moment j'ai besoin de savoir quels champs tu veux récuperer.
Je t'aiderai pour la suite
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
8 avril 2009 à 17:16
Re,

Essaie ce code pour voir si tu obtiens en 1er temps le résultat que tu veux dans rtp.txt
# !/usr/bin/perl 

use strict;
use warnings; # si tu mets ça pas besoin de -w

open LIRE,"karim1.txt" or die "fichier in trouvable";
open ECRIRE,">>rtp.txt\n", or die "E/S : $!\n";

while(<LIRE>){
  if($. % 4 == 3){
    my ($data_1, $data_2, $data_3, $data_4, $data_5) = (split /\|/,$_)[45, 46, 47, 56, 57];
    print ECRIRE "ligne$. \t $data_1 $data_2$data_3 $data_4$data_5 \n";
  }
}
close LIRE;
close ECRIRE;
__END__
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
8 avril 2009 à 17:19
Re,

Voici ce que je'obtiens
lami20j@debian:~/trash$ cat karim3.pl
# !/usr/bin/perl -w

use strict;
use warnings;

open LIRE,"karim1.txt" or die "fichier in trouvable";
open ECRIRE,">>rtp.txt\n", or die "E/S : $!\n";

while(<LIRE>){
  if($. % 4 == 3){
    my ($data_1, $data_2, $data_3, $data_4, $data_5) = (split /\|/,$_)[45, 46, 47, 56, 57];
    print ECRIRE "ligne$. \t $data_1 $data_2$data_3 $data_4$data_5 \n";
  }
}

close LIRE;
close ECRIRE;

#2ème partie
open FILE,"rtp.txt" or die "E/S : $!\n";
my @table;
while(<FILE>){
  /^\w+\s*(\w+)\s*\w+\s*(\w+)/;
  push @table, $2 if $1 == 60;
}
print "@table\n";
__END__

lami20j@debian:~/trash$ perl karim3.pl
9341 9342 934b 934c 9355
lami20j@debian:~/trash$ cat rtp.txt
ligne3   21 9369 4701
ligne7   21 936a 4701
ligne11          21 936b 4701
ligne15          60 f960 9341
ligne19          60 f961 9342
ligne23          21 936c 4701
ligne27          21 936d 4701
ligne31          60 f962 934b
ligne35          60 f963 934c
ligne39          21 9376 471f
ligne43          21 9377 4701
ligne47          21 9378 4701
ligne51          21 9379 4701
ligne55          21 937a 4701
ligne59          21 937b 471f
ligne63          21 937c 4701
ligne67          21 937d 4701
ligne71          21 937e 4701
ligne75          21 937f 4701
ligne79          60 f964 9355
ligne83          21 9380 4701
ligne87          21 9381 4701
ligne91          21 9382 4701
ligne95          21 9383 4701
ligne99          21 9384 4701
ligne103         21 9385 4701
lami20j@debian:~/trash$
0
karim_khouja Messages postés 50 Date d'inscription lundi 6 avril 2009 Statut Membre Dernière intervention 16 février 2010 3
8 avril 2009 à 19:07
merci bcp oui c'est exactement ca Mr Lami, mais c'est pas ca mon probleme maintenant

ce que je veux c'est :

1-) inserer tous les SNBL(=$4) dans un tableau lorseque $2=='60'
2-) le contenue de ce tableau est en hexadecimal je vais le convertir en decimal
3-) distinguer un saut de 33 entre les SNBL c'est a dire comparer le contenu du tableau 2 à 2 si difference = 33 mettre dans une variable le $SNBL (qui est $4 comme je t'ai dis avant)
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
8 avril 2009 à 19:20
Re,

Tu parles de ça (voir en gras)?!

ligne3   21 9369 4701
ligne7   21 936a 4701
ligne11          21 936b 4701
ligne15          60 f960 9341
ligne19          60 f961 9342
ligne23          21 936c 4701
ligne27          21 936d 4701
ligne31          60 f962 934b
ligne35          60 f963 934c
ligne39          21 9376 471f
ligne43          21 9377 4701
ligne47          21 9378 4701
ligne51          21 9379 4701
ligne55          21 937a 4701
ligne59          21 937b 471f
ligne63          21 937c 4701
ligne67          21 937d 4701
ligne71          21 937e 4701
ligne75          21 937f 4701
ligne79          60 f964 9355
ligne83          21 9380 4701
ligne87          21 9381 4701
ligne91          21 9382 4701
ligne95          21 9383 4701
ligne99          21 9384 4701
ligne103         21 9385 4701
0
karim_khouja Messages postés 50 Date d'inscription lundi 6 avril 2009 Statut Membre Dernière intervention 16 février 2010 3
8 avril 2009 à 21:26
c'est exactement ca Mr Lami

se sont les SNBL(s) que je cherche
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
9 avril 2009 à 05:56
Salut,

Ben, sont là
lami20j@debian:~/trash$ perl karim3.pl
9341 9342 934b 934c 9355

C'est cette partie de code
#2ème partie
open FILE,"rtp.txt" or die "E/S : $!\n";
my @table;
while(<FILE>){
  /^\w+\s*(\w+)\s*\w+\s*(\w+)/;
  push @table, $2 if $1 == 60;
}
print "@table\n"

Quand je t'ai montré le résultat j'ai affiché aussi le contenu de fichier
Exécute le script et tu verras

lami20j@debian:~/trash$ cat karim3.pl
# !/usr/bin/perl -w

use strict;
use warnings;

open LIRE,"karim1.txt" or die "fichier in trouvable";
open ECRIRE,">>rtp.txt\n", or die "E/S : $!\n";

while(<LIRE>){
  if($. % 4 == 3){
    my ($data_1, $data_2, $data_3, $data_4, $data_5) = (split /\|/,$_)[45, 46, 47, 56, 57];
    print ECRIRE "ligne$. \t $data_1 $data_2$data_3 $data_4$data_5 \n";
  }
}

close LIRE;
close ECRIRE;

#2ème partie
open FILE,"rtp.txt" or die "E/S : $!\n";
my @table;
while(<FILE>){
  /^\w+\s*(\w+)\s*\w+\s*(\w+)/; # regex
  push @table, $2 if $1 == 60;
}
print "@table\n";
__END__

lami20j@debian:~/trash$ perl karim3.pl
9341 9342 934b 934c 9355
Oublie $2 et $4 puisqu'il n'y a pas.
En fait $1 c'est la capture de deuxième champ qui doit être 60 et $2 c'est la capture de 4ème champ.
Il s'agit en fait des capture faites dans la regex avec les parenthèses (regarde la regex, j'ai mis en gras)
En fait le 1er et le 3ème champ je ne les ai pas capturé. C'est pour ça que le deuxième champ et $1 et le quatrième est $2
0
karim_khouja Messages postés 50 Date d'inscription lundi 6 avril 2009 Statut Membre Dernière intervention 16 février 2010 3
9 avril 2009 à 10:22
bonjour mr Lami

c'est exactement ca c'est tres gentil de ta part
je te souhaite tout le bonheur Mr et tu merite vraiment le "king of perl"

merci bcp 1000 fois
0
karim_khouja Messages postés 50 Date d'inscription lundi 6 avril 2009 Statut Membre Dernière intervention 16 février 2010 3
9 avril 2009 à 15:14
ppp
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
9 avril 2009 à 15:15
Re,

De rien ;-)
Ben, je l'ai mis en résolu. Il y a d'(autres problèmes?!
0
karim_khouja Messages postés 50 Date d'inscription lundi 6 avril 2009 Statut Membre Dernière intervention 16 février 2010 3
9 avril 2009 à 16:14
j'ai mis les SNBL dans un tableau et les numero de sequence dans un autre
et j'ai les convertis en hexadecimal aussi
while(<LIRE>){
  if($. % 4 == 3){
    my ($data_1, $data_2, $data_3, $data_4, $data_5) = (split /\|/,$_)[45, 46, 47, 56, 57];
    print ECRIRE "ligne$. \t $data_1 $data_2$data_3 $data_4$data_5 \n";
  }
}

close LIRE;
close ECRIRE;

#2ème partie
open FILE,"rtp.txt" or die "E/S : $!\n";
my @fec;
my $fec; 
my @rtp;
my $rtp;
while(<FILE>){
  /^\w+\s*(\w+)\s*(\w+)\s*(\w+)/; # regex
  push @fec, $3 if $1 == 60;
  push @rtp, $2 if $1 == 21;
}
for (my $i=0;$i<=$#fec;$i++)
{
$fec[$i] = hex($fec[$i]);
print "$fec[$i] ";
}
#print '********\n';
for (my $j=0;$j<=$#rtp;$j++)
{
$rtp[$j] = hex($rtp[$j]);
print "$rtp[$j] ";
}




maintenant je suis entrain de faire découper le tableau rtp en plusieurs tableaux

for ($i=0; $i<=$#Fec; $i++)
{
if ($Fec[$i+1]-$Fec[$i]==33)
{
my $SNBL = $fec[$i+1];
for($j=0;$j<=$#Rtp;j++)
{
if (Rtp[$j] == $SNBL)
{
for (my $k=$j;my $diff=39;$k++)
{
$diff=$rtp[$k]-$rtp[$j];
push @res,$rtp[$k] if $diff==39;
}
}
}
}
}

chaque matrice contient 40 rtp
en fait supposant que j'ai un tableau rtp qui contient :
RTP[1,2,3,4,5,6,7,8,....,40|41,42,.....,80|81,82....,120|121.....160....]
fec contien ainsi :
FEC[1,2,3,4,5,6,7,8,41,42,43,43,44,45,46,47,48,.....81,...,88.....] les 8 premieres rtp de la matrice
j'espere que tu m'a bien compris
0
karim_khouja Messages postés 50 Date d'inscription lundi 6 avril 2009 Statut Membre Dernière intervention 16 février 2010 3
9 avril 2009 à 16:22
les print met les comme des commentaires car je les fait juste pour etre sure du resultat
0
karim_khouja Messages postés 50 Date d'inscription lundi 6 avril 2009 Statut Membre Dernière intervention 16 février 2010 3
9 avril 2009 à 17:55

    # !/usr/bin/perl -w

use strict;
use warnings;

open LIRE,"/home/sst/Bureau/karim/capture/louati.txt" or die "fichier in trouvable";
open ECRIRE,">/home/sst/Bureau/rtp.txt\n", or die "E/S : $!\n";

while(<LIRE>){
  if($. % 4 == 3){
    my ($data_1, $data_2, $data_3, $data_4, $data_5) = (split /\|/,$_)[45, 46, 47, 56, 57];
    print ECRIRE "ligne$. \t $data_1 $data_2$data_3 $data_4$data_5 \n";
  }
}

close LIRE;
close ECRIRE;

#2ème partie
open FILE,"rtp.txt" or die "E/S : $!\n";
my @fec;
my $fec; 
my @rtp;
my $rtp;
while(<FILE>){
  /^\w+\s*(\w+)\s*(\w+)\s*(\w+)/; # regex
  push @fec, $3 if $1 == 60;
  push @rtp, $2 if $1 == 21;
}
for (my $i=0;$i<=$#fec;$i++)
{
$fec[$i] = hex($fec[$i]);
#print "$fec[$i] ";
}
#print "********\n";
my @res;

for (my $j=0;$j<=$#rtp;$j++)
{
$rtp[$j] = hex($rtp[$j]);
#print "$rtp[$j] ";
}
for (my $i=0; $i<=$#fec; $i++)
{
  if ( $fec[$i+1] - $fec[$i] == 33 )
  {     
        my $SNBL = $fec[$i+1];
        for(my $j=0;$j<=$#rtp;$j++)
          {
           if ($rtp[$j] == $SNBL)
              {
                for (my $k=$j;my $diff=39;$k++)
                   {
                     $diff = $rtp[$k] - $rtp[$j];
                     push @res,$rtp[$k] if $diff==39;
                   }
                }
             }
    }
 }
print "@res ";
        



ces boucles imbriquées continnent encore des erreurs
j'ai fait ceci car j'ai toujours dans chaque matrice(40 rtp) 8 rtp perdus
0
karim_khouja Messages postés 50 Date d'inscription lundi 6 avril 2009 Statut Membre Dernière intervention 16 février 2010 3
10 avril 2009 à 10:01
my @A;
for (my $j=0;$j<=$#rtp;$j++)
{
$rtp[$j] = hex($rtp[$j]);
#print "$rtp[$j] ";
}
for (my $i=0; $i<=$#fec; $i++)
{
if ( $fec[$i+1] - $fec[$i] == 33 )
{
push @A, $fec[$i+1];}}
print "@A\n";

ici j'ai reussis a faire extraire tout les rtp==fec et j'ai les mis dans un tableau @A
ce pendant je veux , pour le moment
$SNBL=$A[0];
for (my $j=0; $j<=$#rtp;$j++)
{
if ($rtp[$j]==$SNBL)
{ # je veux chercher les dans le tableau rtp tout les rtp qui commence par $SNBL et fini par $SNBL+40}
}
please je vous en pris Mr Lami c'est urgent
je sais que je t'ai derangé mais c'est ma derniere demande
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
10 avril 2009 à 11:29
Salut,

Je n'ai pas eu le temps de regarder. Je suis au boulot.
J'ai lu un peu, mais je n'ai pas compris ce que tu veux.
J'ai besoin des cas concrets. Ton code est un peu compliquer.

Par exemple pourquoi tu fait
for (my $j=0;$j<=$#rtp;$j++)

au lieu de
foreach my $j (@rtp){
   traitement de $j
}
Donc explique ce que tu veux obtenir comme résultat (je parle d'un exemple concret) ensuite on verra pour le code.

0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
10 avril 2009 à 12:22
Re,

Si on prends le résultat de message 30 http://www.commentcamarche.net/forum/affich 11871775 awk perl?page=2#30

$NBL c'est quoi?


$SNBL=$A[0];
for (my $j=0; $j<=$#rtp;$j++)
{
if ($rtp[$j]==$SNBL)
{ # je veux chercher les dans le tableau rtp tout les rtp qui commence par $SNBL et fini par $SNBL+40}
}

Ca veut dire quoi fini par $NBL+40 ?

Sinon ton code je le vois plutôt
for (@rtp){
  if($_ == $A[0]){
     # ce que tu veux et je ne comprends pas
}

0