Fonction split dans un awk

Résolu
Bonjour,

Je suis déjà venu vous embeter mais je remet ca.
Je voudrais un tableau de champs et je me suis inspiré de la premiere réponse pour pondre ça :

grep "toto" monfichier.doc | awk -F";" '{n=split($8,tab,":")}'

La fonction semble passer mais ... je ne sais pas comment utiliser mon tableau pour la suite des operations
par exemple, si je fais
echo $tab[1]
je n'obtiens pas le champs que j'attends.

Petite remarque : monfichier ne contietnt qu'une seile ligne toto séparée en 10 "zones" par des ";"
Seul la 8eme "zone" est constituée d'un nombre indéterminé de champs séparés par un ":"

Comment faire pour obtenir cette liste de champs ?

3 réponses

  1. Contributeur
    hello
    le tableau dans awk n'est pas visible du shell. on crée un tableau dans le shell (bash)
    $ cat a1
    a;b;c;d;e;f;g;1:2:3:4:5:6:7:8;i;j
    $ 
    $ tab=($(awk -F";" '{n=split($8,t, ":") ; for(i=1;i<=n;i++)print t[i]}' a1))
    $ 
    $ echo ${tab[0]}
    1
    $ echo ${tab[5]}
    6
    $
    1. Ah .. la syntaxe est particulière ...
      J'ai une erreur de parenthese inatendue (je suis en KornShell) mais je vais essayer de me débrouiller avec ça.
    2. Contributeur
      où est l'erreur ? ksh connait les tableaux : var=(list)
      essayer
      $ x="$(awk -F";" '{n=split($8,t, ":") ; for(i=1;i<=n;i++)print t[i]}' a1)" 
      $ tab=($x) 
      $
    3. le x="$... passe
      mais tab=($x) râle encore sur les parentheses ...

      mais ça m'ouvre un autre probleme : comment ce fait-il qu'on utilise pas "export" pour enregistrer la variable x ? O_o
      J'ai toujours utilisé des export, moi ... pour rien ? (ou alors, c'est pour les variables qui tourneront hors de mon script ? j'espere que oui)

      Si je fais
      tab="($x)"
      ca passe à moitié : je n'ai pas d'erreur mais
      #echo ${tab}
      (1 2 3 4 5 6 7 8)

      # echo ${tab[1]}

      ce qui correspond, je pense à NULL ou chaine vide
    4. Contributeur
      essayer sans "
      tab=($x)
      $ exec ksh
      $ 
      $ cat a1
      a;b;c;d;e;f;g;1:2:3:4:5:6:7:8;i;j
      $ x="$(awk -F";" '{n=split($8,t, ":") ; for(i=1;i<=n;i++)print t[i]}' a1)"
      $ tab=($x)
      $ 
      $ echo ${tab[0]}
      1
      $ 
      

      le export est nécessaire si on veut que les variables soient visibles dans d'autres shells ou programmes lancés depuis le shell courant:
      $ a=1 
      $ bash 
      $ echo $a 
      
      $ export x=1 
      $ bash 
      $ echo $x 
      1 
      $ 
    5. Merci (encore) dubcek, on s'approche petit à petit :
      Par exemple, pour le dernier cas que je présentais, j'ai pu remarquer, ensuite, que
      # echo ${tab[1]}
      (1 2 3 4 5 6 7 8)

      Grosso modo, le tableau = var(list) ne passe pas, ce qu'il faut, c'est séparer les éléments par un retour chariot.
      Par chance, j'ai réussi à trouver ça :
      # grep 'a' a1 | awk -F";" '{n=split($8,t, ":") ; for(i=1;i<=n;i++)print t[i] }'
      1
      2
      3
      4
      5
      6
      7
      8

      Exactement ce que je veux ... si ce n'est que c'est pas encore dans un tableau. Et je gere pas assez bien les ", ' et ' pour réussir à me dépatouiller de ce truc >_<
      Je peux te demander un dernier coup de main pour gerer ces satanées Xquotes ?
  2. Modérateur
    Peux tu nous dire quel est le format du fichier et ce que tu souhaites obtenir. Le awk est très proches du C, tu peux tout à fait déclarer des variables intermédiaires (typage automatique). Tout est très bien expliqué dans "man awk".

    Pour faire simple, un programme awk est composé d'un bloc BEGIN (lancé au début de la lecture), d'un bloc END (lancé à la fin de la lecture), et de blocs généralement activés uniquement si leur test le permet (typiquement, un test basé sur une expression régulière.

    Au sein de chacun de ces blocs, délimités par une paire d'accolades, tu écris l'algo que tu veux (la syntaxe ressemblant beaucoup au langage C).

    Bonne chance
    1. J'y avais pensé mais l'algorythme est un peu trop gros (pour moi) pour que je mette tout dans un seul gros awk.
      Je dois aller chercher des infos dans des fichiers différents, suivant ce que je vais récuperer dans ce tableau et c'est ça qui m'éffraie ("aller chercher des fichiers", pas le tableau en lui même)
  3. Modérateur
    Salut,

    Et comme ça :

    $ cat plop
    a;b;c;d;e;f;g;1:2:3:4:5:6:7:8;i;j
    
    $ VAR=$(awk -F";" '{ print $8 }' plop)
    
    $ TAB=( ${VAR//:/ } )
    
    $ echo ${TAB[2]}
    3
    
    $ echo ${TAB[0]}
    1
    
    $ echo ${TAB[@]}
    1 2 3 4 5 6 7 8
    
    $ echo ${#TAB[*]}
    8
    
    $

    ;-))
    1. J'y ai cru mais non :
      # TAB=(${VAR//:/ })
      ksh: 0403-057 Erreur de syntaxe: '(' inattendu.

      # TAB="( ${VAR//:/ } )"
      ksh: TAB="( ${VAR//:/ } )": 0403-011 Substitution incorrecte pour cette commande.

      # TAB='(${VAR//:/ })' <- T_T j'avoue avoir crié "Ouais !" dans le bureau
      # echo $TAB
      (${VAR//:/ }) <- mais là, j'ai du faire "ah ben non :-( "

      # TAB='(${VAR//:/ })'
      ksh: ${VAR//:/ }: 0403-011 Substitution incorrecte pour cette commande.
    2. Modérateur
      ksh93 --version
        version         sh (AT&T Research) 93t 2008-06-24

      Chez moi ça passe avec cette version de KSH ;-)