Fonction split dans un awk
Résolu
Utilisateur anonyme
-
dubcek Messages postés 18789 Date d'inscription Statut Contributeur Dernière intervention -
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 ?
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:
- Linux awk split
- Split cam - Télécharger - Messagerie
- Linux reader - Télécharger - Stockage
- Toutou linux - Télécharger - Systèmes d'exploitation
- Backtrack linux - Télécharger - Sécurité
- R-linux - Télécharger - Sauvegarde
3 réponses
hello
le tableau dans awk n'est pas visible du shell. on crée un tableau dans le shell (bash)
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 $
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
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
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)
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)
Salut,
Et comme ça :
;-))
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 $
;-))
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.
# 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.
J'ai une erreur de parenthese inatendue (je suis en KornShell) mais je vais essayer de me débrouiller avec ça.
essayer
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
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:
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 ?