Awk-perl

Résolu
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
Configuration: Windows XP
Firefox 3.0.8

75 réponses

Résumé de la discussion

Un fichier hexadécimal contenant des mots séparés par le caractère pipe présente une problématique d’extraction ciblée, nécessitant une combinaison d’outils comme awk et perl pour isoler certaines colonnes. Les tentatives utilisent awk -F| et des blocs BEGIN/END avec des compteurs NR, puis l’intégration dans un script Perl, signalant des difficultés liées au séparateur et aux sauts de ligne. Plusieurs facteurs techniques, notamment Windows CRLF et un fichier long semblable à une capture Wireshark, orientent les propositions vers l’ajustement des blocs de 32 lignes et l’adaptation du séparateur selon l’environnement.

Bobot (l’IA à votre service)
  1. salut ,

    j'ai terminer mais je te demande une solution s'il y on a

    j'ai trois script perl maintenant bien faite, j'ai developper une interface graphique GTK2-perl
    j'ai trois boutons radios, chaque bouton dois faire appel a un script

    est ce que cette commande permet de faire cette tache efficacement?

    system("/usr/bin/perl /path/to/my_script.pl ");

    merci bcp
    1. merci a votre aide Mr Lami durant tout ma periode de pfe
      1. Modérateur
        Re,

        ça y est j'ai trouver une solution maintenant et elle fonctionne correctement
        C'est parfait. Donc je n'ai plus rien à faire ;-))
        1. dans toute les cas Merci beaucoup Mr Lami tu m'as bcp aidé
          je te remercie infinement
          ça y est j'ai trouver une solution maintenant et elle fonctionne correctement
          1. Modérateur
            Re,

            Il y toujours des solutions, mais la facilité d'une solution depends de la compréhension du problème.
            Je n'ai fait que te donner des morceaux de code.
            1. j'ai arrivé maintenant a un petit resultat
              mais si ca va marcher il faut que :

              si je stocke dans un tableau par exemple les indices 1,3,6
              il faut que j'efface les premiers 40 elements du tableau et les troisiemes 40 elements et les 6ieme 40 elements

              y a t-il une solution facile?
              1. Modérateur
                Re,

                Puisque tu travailles avec les indices.
                Utilises plutôt mon code.
                1. oui mes données arrivent a 65530
                  j'ai pas arrivé a un resultat fonctionnable jusqu'a maintenant
                  1. je vous en pris Mr Lami c'est la derniere aide
                    please
                    1. Modérateur
                      Salut,

                      Tu l'as déjà dit une fois que c'est la dernière. Ne dit pas que je ne t'ai pas averti ;-)))
                      Je vais regarde ce soir, mais je ne promets rien.
                  2. j'ai fait ce que tu m'a appris a faire mais reste une condition comment verifier que les zeros sont consécutives?

                    # !/usr/bin/perl -w

                    use strict;
                    use warnings;
                    my @A;
                    my @Tfin =(1,2,3,4,5,6,7,8,9,10,0,0,0,0,0,0,0,0,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,0,0,0,0,5,0,0,0,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80);

                    for (my $i=0; $i<=$#Tfin; $i+=40)
                    {
                    my $b=($i/40)+1;
                    push @A,$b if (scalar grep {/^0$/} @Tfin[$i..$i+39])==8;
                    }
                    print"@A\n";
                    1. Modérateur
                      Re,

                      Ce n'est pas comme ça que je t'ai appris ;-)))

                      Attention, au contexte.
                      C'est vraiement inutile et tordue de faire my $b=($i/40)+1; quand on a déjà les éléments de tableau.

                      La solution que je t'ai donné traite les éléments de tableau quelque soit leur valeur.
                      Dans ton cas tu divises l'indice de tableau avec 40 et tu lui ajoute 1.
                      Mais ça ne marchera pas si tu auras d'autres valeurs dans le tableau.
                      Bref tu traites les valeurs.
                      C'est un peu comme sous Excel, travailler avec les cellules par adresse ou par contenu.
                      Une approche par adresse permet de rendre la solution acceptable quelque soit le contenu ce qui n'est pas le cas si on utilise des valeurs constantes.

                      Ma variante prends deux tranches de tableau, les 40 premiers éléments et la suite de 40 et ensuite teste s'il y a des zéros.

                      Le traitement des zéro consecutives suivis d'autre zéro peut poser des problèmes si on pense aux dizaines.
                      Et ton tableau et censé d'avoir que des données jusqu'à 80, ou il peut avoir des données plus grand que 100?
                  3. les huits zero ok mais la conditions qu'ils soient consécutives?
                    c ca le probleme?
                    1. Mr est ce que vous m'avez compris?
                      je te jure que je me suis trés pressé du temps
                      demain je vais présenter ma premiere partie et elle manque que cette condition
                      1. je dois parcourir mon tableau 40 part 40 (chaque 40 a part) ( chaque 40 constitut une matrice c'est une chose comme ca)

                        il doit m'afficher :
                        *)la matrice 1 est fausse car j'ai 8 zeros consecutives et pas d'autres zeros

                        1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,0,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40

                        *)la matrice 2 est vrai car j'ai huit zero consécutive oui mais une fois je trouve d'autres zeros l'analyse devienne positive

                        41,42,43,44,45,46,47,48,49,50,51,52,0,0,55,56,57,58,59,60,61,62,63,0,0,0,0,0,0,0,0,72,73,74,75,76,77,78,79,80
                        1. Modérateur
                          Re,

                          Je ne comprends pas.
                          Montre ton exemple sur le tableau que tu m'as donné.
                          my @Tfin=(1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,0,18,19,
                                    20,21,22,23,24,25,26,27,28,29,
                                    30,31,32,33,34,35,36,37,38,39,
                                    40,41,42,43,44,45,46,47,48,49,
                                    50,51,52,0,0,55,56,57,58,59,
                                    60,61,62,63,0,0,0,0,0,0,0,0,
                                    72,73,74,75,76,77,78,79,80);
                          

                          1. non quand il y a 8 zero et les zero sont consécutives afficher faut
                            exemple :
                            1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,0,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40 faut
                            1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,0,0,0,0,0,0,0,0,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40 faut
                            1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,0,0,0,0,0,0,0,0 faut

                            la position n'importe mais les zeros doit etre 8 et consecutives

                            merci bcp
                            1. Modérateur
                              Salut,

                              Tu veux faire quoi?
                              Afficher faux quand il y a seulement 8 zéros et vrai quand il plus de huit zéros?
                              lami20j@debian:~/trash$ cat vraifaux.pl
                              #!/usr/bin/perl
                              use strict;use warnings;
                              
                              my @Tfin=(1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,0,18,19,
                                        20,21,22,23,24,25,26,27,28,29,
                                        30,31,32,33,34,35,36,37,38,39,
                                        40,41,42,43,44,45,46,47,48,49,
                                        50,51,52,0,0,55,56,57,58,59,
                                        60,61,62,63,0,0,0,0,0,0,0,0,
                                        72,73,74,75,76,77,78,79,80);
                              
                              print "FAUX\n" if (scalar grep { /^0$/ } @Tfin[0 .. 39]) == 8;
                              print "VRAI\n" if (scalar grep { /^0$/ } @Tfin[40 .. 79]) == 10;
                              __END__
                              lami20j@debian:~/trash$
                              lami20j@debian:~/trash$ perl vraifaux.pl
                              FAUX
                              VRAI
                              
                              1. salut Mr Lami
                                merci pour la reponse d'hier j'été trop fatigué c'est pourquoi il m'a paru que les resultats sont fausse mais j'ai mis le bon code dés le début.

                                j'ai un probleme Mr
                                supposons que j'ai un tableau
                                my @Tfin=(1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,0,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40, 41,42,43,44,45,46,47,48,49,50,51,52,0,0,55,56,57,58,59,60,61,62,63,0,0,0,0,0,0,0,0,72,73,74,75,76,77,78,79,80);

                                je vais analyser 40 element par 40 a part : (analyser le tableau du [1 .. 40] puis [41..80]...)

                                je trouve 8 et seulement 8 zeros consécutives dans chaque 40 elements on affecte a un autre tableau un numero d'indice de sous tableau expl: pour les 40 premiere leurs indice est 40/40=1 , le deuxieme 80/40=2, ...

                                ici le premier sous tableau est faux car on a seulement 8 zeros consecutives
                                tandisque le deuxieme sous tableau est vrai car il possedes 8 zero consécutives + 2 autres zero

                                je sais que je m'exprime mal mais si jamais vous avez besoin d'une information
                                please n'hesitez pas
                                je vous en pris Mr
                                Merci infinement
                                1. Modérateur
                                  Re,

                                  Pour vérifier il suffit d'afficher les tableaux
                                  print "@num_Mat_errAA\n";
                                  print "@num_Mat_sans_err\n";
                                  print "@mat_ERR\n";
                                  • 1
                                  • 2
                                  • 3
                                  • 4