Fonction split dans un awk

Résolu
Utilisateur anonyme -  
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   -
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 ?

A voir également:

3 réponses

dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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
$
3
Utilisateur anonyme
 
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.
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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) 
$
0
Utilisateur anonyme
 
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
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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 
$ 
0
Utilisateur anonyme
 
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 ?
0
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
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
0
Utilisateur anonyme
 
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)
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
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

$

;-))
0
Utilisateur anonyme
 
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.
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
ksh93 --version
  version         sh (AT&T Research) 93t 2008-06-24

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