Resultat awk dans un tableau

Romain -  
 Romain -
Bonjour,

Alors mon souci actuellement est de récuperer les valeurs qui sortent de la commande awk.
La commande que j'effectue est :
- awk 'BEGIN{ FS=";" }{ print NF-1 }' $FileName
Cela me permet de savoir le nombre de champ sur chaque ligne.

Donc cette commande me sort à l'affichage :
16
25
21
16
33
25
12
14
28
34
18
...

Je voudrais justement insérer ses valeurs dans un tableau afin de les traiter.
Je voudrai éviter de créer un fichier.
Est-ce possible?

11 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    [tmpfs]$ cat plop
    16
    25
    21
    16
    33
    25
    12
    14
    28
    34
    18
    
    [tmpfs]$ awk '{ print $1 }' plop
    16
    25
    21
    16
    33
    25
    12
    14
    28
    34
    18
    
    [tmpfs]$ TABLE=( $(awk '{ print $1 }' plop) )
    
    [tmpfs]$ echo ${TABLE[0]}
    16
    
    [tmpfs]$ echo ${TABLE[2]}
    21
    
    [tmpfs]$ echo ${TABLE[6]}
    12
    
    [tmpfs]$ echo ${TABLE[@]}
    16 25 21 16 33 25 12 14 28 34 18
    
    [tmpfs]$ echo ${#TABLE[@]}
    11
    
    [tmpfs]$

    Bien que "awk" gère les tableaux (à 2 dimensions) en natif aussi ;-))
    0
  2. Romain
     
    Justement je voudrai éviter la créer un fichier !!

    Avec le cat tu crée justement le fichier que je veux éviter.
    Est-ce possible sans le cat?
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Le cat c'est un exemple (il représente ton fichier de départ que je n'ai pas sous la main), donc ce qui importe c'est la variable qui récupère le tableau.
      0
  3. Romain
     
    Oui certe cela je l'ai compris

    Mais mon fichier n'est pas organiser de la façon suivante:
    16
    25
    21
    16
    33
    25
    12
    14
    28
    34
    18

    C'est juste le résultat de la commande awk qui m'indique le nombre de champs que possède le fichier que je traite.
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Oui certe cela je l'ai compris
      Ben non tu n'as pas compris ;-(

      Je n'ai pas ton fichier de départ, donc j'en ai créé un (plop) avec juste les données nécessaires à récupérer (vu que je n'ai pas le source original) pour te montrer comment exploiter le résultat de la commande "awk" en le récupérant dans une variable (TABLE)...

      Si tu préfères :

      TABLE=( $(awk 'BEGIN{ FS=";" }{ print NF-1 }' $FileName) )


      C'est plus clair ?
      0
  4. Romain
     
    Ce que tu explique c'est déjà ce que je faisai avant.

    Mais lorsque je fais TABLE=$( (awk 'BEGIN{ FS=";" }{ print NF-1 }' $FileName) )
    alors toutes les valeurs sont dans TABLE[O]
    et dans TABLE[1] par exemple je n'ai rien.

    A part en créant un nouveau fichier je n'ai pas trouver le moyen pour le moment.
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Tu peux copier/coller un bout de ton fichier source ($FileName), s'il te plaît ?
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Romain
     
    c'est un fichier excel organiser de tel façon:

    date|nomFichier|date1|date2|...

    tout ça sur 803 lignes pour ce fichier.
    Chaque ligne n'a pas le meme nombre de date c'est pour cela que je veux récuperer le nombre de champs par ligne pour éxécuter des requêtes plus facilement.
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Sans le fichier source pour exécuter des tests on ne pourra pas t'aider pour savoir pourquoi ça ne marche pas chez toi ;-\

      Mais à priori, je pencherai pour un problème de fin de ligne (fichier windows oblige) ;-((

      Voir Conversion retours chariots DOS (CRLF) / UNIX (LF)
      0
  7. Romain
     
    Si ça peut t'aider voilà un bout du fichier excel :

    01/01/2009;ST2495;20081219;20081221;20081222;20081223;
    02/01/2009;ST2343;20081226;20081228;20081229;20081230;20081231;
    03/01/2009;ST2454;20081203;20081222;
    04/01/2009;ST2542;20081229;20081230;20081231;20090101;
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Affiche le même résultat mais avec un :

      cat -A le_fichier
      0
  8. Romain
     
    Ah sur chaque fin de ligne il a ^M$ en plus, ce qui doit correspondre au symbole de fin de ligne je suppose.
    Je vais voir si en modifiant l'IFS cela va changer quelque chose dans la récupération de données.

    Je viens de tester en indiquant avant la commande IFS='^M$' et cela ne change rien.
    Dois-je le prendre en compte dans la commande awk ?
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Même avec des ^M$ ça passe :

      [tmpfs]$ cat -A romain
      01/01/2009;ST2495;20081219;20081221;20081222;20081223;^M$
      02/01/2009;ST2343;20081226;20081228;20081229;20081230;20081231;^M$
      03/01/2009;ST2454;20081203;20081222;^M$
      04/01/2009;ST2542;20081229;20081230;20081231;20090101;^M$
      
      [tmpfs]$ TABLE=( $(awk 'BEGIN{ FS=";" }{ print NF-1 }' romain) )
      
      [tmpfs]$ echo ${TABLE[@]}
      6 7 4 6
      
      [tmpfs]$ echo ${TABLE[2]}
      4
      
      [tmpfs]$
      0
  9. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    [tmpfs]$ cat -A romain
    01/01/2009;ST2495;20081219;20081221;20081222;20081223;$
    02/01/2009;ST2343;20081226;20081228;20081229;20081230;20081231;$
    03/01/2009;ST2454;20081203;20081222;$
    04/01/2009;ST2542;20081229;20081230;20081231;20090101;$
    
    [tmpfs]$ TABLE=( $(awk 'BEGIN{ FS=";" }{ print NF-1 }' romain) )
    
    [tmpfs]$ echo ${TABLE[@]}
    6 7 4 6
    
    [tmpfs]$ echo ${TABLE[2]}
    4
    
    [tmpfs]$


    ;-))
    0
  10. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    hello
    Mais lorsque je fais TABLE=$( (awk 'BEGIN{ FS=";" }{ print NF-1 }' $FileName) )
    n'est ce pas plutot : TABLE=($ (awk 'BEGIN{ FS=";" }{ print NF-1 }' $FileName) )
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Salut,

      Bien vu, merci ;-))

      PS. Il a du copier/coller ma syntaxe avant que je ne l'a corrige, désolé ;-(
      0
  11. Romain
     
    Ok donc il faut que je change chaque fin de ligne et je verrai si cela fonctionne.
    Existe t'il une commande pour le faire rapidement pour insérer cette fin de ligne?

    car la commande :
    sed 's/^M$//' fichier
    enlève toute la fin de ligne.

    PS: dubcek, les 2 sont équivalents pour ma requete puisque je renvoi un entier.
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Ressaies avec :

      TABLE=( $(awk 'BEGIN{ FS=";" }{ print NF-1 }' $FileName) )
      0
  12. Romain
     
    Etrange le sed n'arrive pas a modifier la fin de ligne, cela reste '^M'
    Et j'avais bien écrit dans le code
    TABLE=( $(awk 'BEGIN{ FS=";" }{ print NF-1 }' $FileName) )

    Donc peut être que c'est du à la version du système Linux du serveur, ou à autre chose.

    Le sed est le seul moyen de modifier la fin de ligne??

    En tout cas merci pour les réponses
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      C'est sensé marcher même avec des ^M (voir message #16)

      Au fait le ^M s'obtient avec la combinaison de touche "CTRL V" + "CTRL M"...

      Le sed est le seul moyen de modifier la fin de ligne??
      Non, il y "dos2unix" (et "unix2dos") qui font ça très bien aussi (voir les man).
      0
    2. Romain
       
      Le dos2unix marche nickel
      Par contre TABLE=( $(awk 'BEGIN{ FS=";" }{ print NF-1 }' $FileName) )
      ne fonctionne toujours pas comme sur ton exemple.
      Je ne comprend pas pourquoi cela répond d'une autre façon.
      Entre temps j'ai trouver une autre façon de faire.
      Je lis le fichier en enlevant préalablement tout sauf les délimiteurs et je compte leur nombre sur chaque ligne à l'aide d'un compteur.
      0