[Shell] Sélection de la n-ième chaine

Résolu
Bonjour,

J'aimerais savoir comment récupérer un élément de la n-ième occurrence d'une chaine de caractère. Je m'explique :
dans un de mes shells, je lance la commande suivante
inputFile=`grep bcp $currv/batchMngt/batches/$1 | awk '{print $4}'`
Mon but est de pouvoir réutiliser cette ligne pour la seconde ligne contenant bcp, puis la troisième, etc...

Merci pour votre aide.

Trez
Configuration: SunOS 5.9

5 réponses

  1. Re- Jipicy
    $ cat test.txt
    bcp secondChamp troisiemeChamp quatriemeChamp
    bcp secondChamp troisiemeChamp quatriemeChamp2
    bcp secondChamp troisiemeChamp quatriemeChamp3
    $
    $ grep bcp test.txt | awk '{print $4}'
    quatriemeChamp
    quatriemeChamp2
    quatriemeChamp3
    $
    $ grep bcp test.txt | awk '{print $4}' | sed -n ''$2'p'
    quatriemeChamp
    quatriemeChamp2
    quatriemeChamp3


    Ca ne filtre pas :-///
    1. Modérateur
      Ben c'est normal, le paramètre "$2" n'est pas défini ;-))
      jp@MDK:~/tmpfs ssh$ set 1 2
      jp@MDK:~/tmpfs ssh$ grep bcp bar.txt | awk '{print $4}' | sed -n ''$2'p'
      quatriemeChamp2
      jp@MDK:~/tmpfs ssh$ grep bcp bar.txt | awk '{print $4}' | sed -n ''$1'p'
      quatriemeChamp
      jp@MDK:~/tmpfs ssh$
      
      ;-)
    2. @jipicyWahh,
      j'suis une vraie buse...
      Merci jipicy ;-)
    3. Modérateur
      @TrezegChange de pseudo alors ;-DDD

      ;-)
  2. Contributeur
    grep | awk, quel gachis de resources :-))

    inputFile=` awk 'NR=='$2' && /bcp/ {print $4}' $currv/batchMngt/batches/$1`
    1. Modérateur
      Ben si on peut plus ce faire plaisir aussi ;-)))

      Bien joué ;-)
    2. Merci dubcek mais...
      $ awk 'NR=='$2' && /bcp/ {print $4}' test.txt
      awk: syntax error near line 1
      awk: bailing out near line 1
      $
      Ou encore
      $ set InputFile=`awk 'NR=='$2' && /bcp/ {print $4}' test.txt`
      awk: syntax error near line 1
      awk: bailing out near line 1
      $
      J'ai également essayé avec nawk .
      $ nawk 'NR=='$2' && /bcp/ {print $4}' test.txt
      nawk: syntax error at source line 1
       context is
              NR== >>>  && <<<
      nawk: bailing out at source line 1
      $


      :-\\
    3. Modérateur
      @TrezegMême réponse qu'en #7 faut définir le paramètre $2 !!!

      ;-))
    4. Contributeur
      J'ai trop vu de cat | grep | grep | awk .. j'en souffre encore :-)(
  3. Modérateur
    En reprenant ta syntaxe :
    inputFile=`grep bcp $currv/batchMngt/batches/$1 | awk '{print $4}' | sed -n ''$2'p'`
    Peut être qu'une solution existe avec awk (ce qui serait plus simple), mais là je ne l'ai pas...

    Edit : J'ai trouvé :
    inputFile=`grep bcp $currv/batchMngt/batches/$1 | awk 'NR=='$2'{print $4}'`
    
    --
    Z'@+...che.<code>JP : Zen, my Nuggets ! ;-)
    Le savoir n'est bon que s'il est partagé.
    1. Salut,

      En fait tout part d'une procédure stockée crée en Sybase et qui appelle mon shell.
      Ce dernier prend en paramètre un nom de fichier pour lequel il va réaliser un traitement.
      $ myShell.ksh myFile.txt
      Ce shell recherche dans le fichier, le 4eme champ de la (ou des) ligne contenant le mot bcp.
      J'aimerais pouvoir modifier mon shell de facon a lui ajouter un paramètre de rang qui me permettra de continuer à récupérer le 4eme champ du second paramètre
      $ myShell.ksh myFile.txt 3
      Doit me donner le 4eme champs de la 3eme ligne contenant bcp.

      Voilou

      Merci
      1. Modérateur
        Salut,

        J'ai du mal à comprendre ce que tu veux exactement !

        D'abord tu parles de "récupérer un élément de la n-ième occurrence d'une chaine de caractère", puis ensuite d'après ce que je comprend, tu veux récupérer chaque ligne (enfin chaque champ $4) dans une variable...

        Peux-tu m'éclairer ? Merci.