Awk-perl
Résolu
karim_khouja
Messages postés
50
Date d'inscription
Statut
Membre
Dernière intervention
-
karim_khouja Messages postés 50 Date d'inscription Statut Membre Dernière intervention -
karim_khouja Messages postés 50 Date d'inscription Statut Membre Dernière intervention -
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
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:
- Awk-perl
- Denon perl pro test - Accueil - Audio
- Active perl - Télécharger - Édition & Programmation
- Perl exec - Forum Perl
- Awk dédoublonner un print ✓ - Forum Shell
- Perl et Variable - Forum Perl
75 réponses
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
106485010510997108
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
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,
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,
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.
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.
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";
}
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";
}
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
Je t'aiderai pour la suite
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
Re,
Essaie ce code pour voir si tu obtiens en 1er temps le résultat que tu veux dans rtp.txt
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__
Re,
Voici ce que je'obtiens
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$
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)
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)
Re,
Tu parles de ça (voir en gras)?!
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
Salut,
Ben, sont là
lami20j@debian:~/trash$ perl karim3.pl
9341 9342 934b 934c 9355
C'est cette partie de code
Quand je t'ai montré le résultat j'ai affiché aussi le contenu de fichier
Exécute le script et tu verras
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
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 9355Oublie $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
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
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
j'ai mis les SNBL dans un tableau et les numero de sequence dans un autre
et j'ai les convertis en hexadecimal aussi
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
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
# !/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
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
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
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
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.
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
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 }