Resultat awk dans un tableau

Fermé
Romain - Modifié par Romain le 14/04/2010 à 09:41
 Romain - 14 avril 2010 à 14:44
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

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
14 avril 2010 à 09:43
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
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 jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
14 avril 2010 à 10:04
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
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 jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
Modifié par jipicy le 14/04/2010 à 10:23
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
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 jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
14 avril 2010 à 10:31
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
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 jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
14 avril 2010 à 10:39
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
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 jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
Modifié par jipicy le 14/04/2010 à 10:51
Affiche le même résultat mais avec un :

cat -A le_fichier
0
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 jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
14 avril 2010 à 11:09
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 jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
14 avril 2010 à 10:58
[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 18748 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 26 septembre 2024 5 618
14 avril 2010 à 11:00
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 jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
14 avril 2010 à 11:03
Salut,

Bien vu, merci ;-))

PS. Il a du copier/coller ma syntaxe avant que je ne l'a corrige, désolé ;-(
0
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 jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
14 avril 2010 à 11:15
Ressaies avec :

TABLE=( $(awk 'BEGIN{ FS=";" }{ print NF-1 }' $FileName) )
0
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 jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
14 avril 2010 à 13:14
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
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