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?


A voir également:

11 réponses

jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
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
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
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
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
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
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
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
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
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Tu peux copier/coller un bout de ton fichier source ($FileName), s'il te plaît ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
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
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
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Affiche le même résultat mais avec un :

cat -A le_fichier
0
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
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
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
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
[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
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Salut,

Bien vu, merci ;-))

PS. Il a du copier/coller ma syntaxe avant que je ne l'a corrige, désolé ;-(
0
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
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Ressaies avec :

TABLE=( $(awk 'BEGIN{ FS=";" }{ print NF-1 }' $FileName) )
0
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
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
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
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