GAWK et extraire des données recursivement

Résolu
Bonjour,

j'ai un problème avec l'utilitaire GAWK :

comment extraire de plusieurs fichiers txt un bloc de chaîne variant d'un fichier à un autre mais se trouvent tous à la 5eme ligne jusqu'a la ligne 9
exemple

-fic1.txt
...
32453254wdf35454sdf <- ligne n 5
qsfwdg645645645354
dwg454554654
dwgdgx6546545 <- ligne n 10
....
fic2
..
jkluhfqdulidfqs554df <- ligne n 5
fkhdf54636354654fsd
fuihdf54654645sfd
fsdoijdf646464d <- ligne n 10
....

je dois faire ce traitement sous GAWK pour win32

MERCI

--
** (groups.google.com/group/batchers) **

----Mon Nouveau Moi ---------------
Configuration: un peu de tout quoi..du futur j'en est pris un IE 10..un Win 8 (c'est après le 7)..ah autre chose il n' y aura plus de clavier mais à la place une chose qui s'appelle la "trompe-de-saturne"

7 réponses

  1. Modérateur
    Salut,

    Avec "sed" ça ne t'intéresse pas ?

    Merci de retirer la pub de ta signature à l'avenir !
    1. Contributeur
      hello
      du DOS, les puristes vont hurler :-)
      $ cat f1.txt
      1
      2
      3
      4
      32453254wdf35454sdf <- ligne n 5
      qsfwdg645645645354
      dwg454554654
      888888
      999999
      dwgdgx6546545 <- ligne n 10
      11
      12
      13
      $ cat  f2.txt
      1
      2
      3
      4
      jkluhfqdulidfqs554df <- ligne n 5
      fkhdf54636354654fsd
      fuihdf54654645sfd
      88888
      999999
      fsdoijdf646464d <- ligne n 10
      11
      12
      $ echo off
      for %f in (f1.txt f2.txt) do  gawk "NR >= 5 && NR <= 10 {print $0}" %f 
      32453254wdf35454sdf <- ligne n 5
      qsfwdg645645645354
      dwg454554654
      888888
      999999
      dwgdgx6546545 <- ligne n 10
      jkluhfqdulidfqs554df <- ligne n 5
      fkhdf54636354654fsd
      fuihdf54654645sfd
      88888
      999999
      fsdoijdf646464d <- ligne n 10
      
      1. Modérateur
        sed -ns '6,9p' fich*
        ;-))
    2. merci beaucoup pour tous .. mon 1er code était

      BEGIN{
       var=system("dir/a-d/b *.txt")
       print var
      }


      quels changement dois-je faire pour qu'il fonctionne ? avec la fonction system()

      merci encore
      1. Contributeur
        je pense qu'il vaut mieux exécuter une boucle extérieure pour trouver les fichiers. Une fois les fichiers trouvés il faudrait, à l'intéreur de gawk les ouvrir et les traiter, perl serait plus adapté.

        for /f "tokens=*" %f in ('dir /a-d /b *.txt') do <gawk ou sed pour traiter les fichiers trouvés>

        sinon, system() ne retourne pas le résultat de la commande, mais son status de fin. pour récupérer des noms de fichiers dans un tableau x, il faudrait faire:
        gawk "BEGIN{n=0;while(\"dir /a-d /b *.txt\"|getline){x[n++]=$0;print $0}}"<NUL
        1. bonjour et merci encore dubcek,

          En Perl "hybride-inline" ça doit donner une chose du genre:
          for %a in (*.txt) do perl -ne "print if($. >= 5 && $. <=9)" "%a"


          gawk "BEGIN{n=0;while(\"dir /a-d /b *.txt\"|getline){x[n++]=$0;print $0}}"<NUL


          merci pour le code, peux-tu m'expliquer brièvement les syntaxes utiliser, car le help de GAWK

          GAWK --help lui même doit avoir un help..on ne comprends rien il n'y a pas d'exemples...merci encore

          et quel est la différence avec:

          gawk "BEGIN{system(\"dir/b/a-d *.txt\");print var}"


          j'ai pas compris la différence entre "resultat" d'une commande et son "status" ?

          Qui sait peut être que ce POST devienne une réference plus tard..on ne sait jamais ;)

          merci et @+
          1. Contributeur
            toutes les commandes, DOS ou Linux retournent un status, errorlevel en DOS, $? en shell Linux, en général 0 pas de problème, 1 (ou plus) il y a eu un problème, ex. en DOS:
            $ dir zzzz
            Fichier introuvable
            $ echo %errorlevel%
            1
            $ dir /b f1.txt
            f1.txt
            $ echo %errorlevel%
            0

            gawk "BEGIN{n=0;while(\"dir /a-d /b *.txt\"|getline){x[n++]=$0;print $0}}"<NUL
            f1.txt
            f2.txt
            

            ce code affiche et stocke le nom de chaque fichier dans un tableau appellé x pour un traitement ultérieur dans gawk, ici on n'en fait rien

             gawk "BEGIN{var=system(\"dir/b/a-d *.txt\");print var}"
            f1.txt
            f2.txt
            0

            ce code affiche le résultat de la comande dir et le status qu'elle retourne, 0 donc ok
            1. merci dubcek du retour et de ta contribution fort précieuse