AWK le cri du désespoir
Résolu/Fermé
fgtp
Messages postés
2
Date d'inscription
mercredi 17 septembre 2008
Statut
Membre
Dernière intervention
18 septembre 2008
-
17 sept. 2008 à 15:45
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 - 22 sept. 2008 à 14:32
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 - 22 sept. 2008 à 14:32
A voir également:
- AWK le cri du désespoir
- Awk split ✓ - Forum Shell
- Cri cont gmail - Guide
- Ps awk ✓ - Forum Debian
- Chanson avec cri de femme ✓ - Forum Musique / Radio / Clip
- Livre audio le cri de la mouette - Forum Audio
4 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
17 sept. 2008 à 20:21
17 sept. 2008 à 20:21
Salut,
Il nous faut des exemples plus parlants, comme le contenu des fichiers à modifier (avant et après).
Si j'ai bien compris, chaque champ de la 1ère ligne est lié avec les champs respectifs des lignes 2 et 3 ? Ou pas (autrement dit j'ai rien compris) ?
Il nous faut des exemples plus parlants, comme le contenu des fichiers à modifier (avant et après).
Si j'ai bien compris, chaque champ de la 1ère ligne est lié avec les champs respectifs des lignes 2 et 3 ? Ou pas (autrement dit j'ai rien compris) ?
fgtp
Messages postés
2
Date d'inscription
mercredi 17 septembre 2008
Statut
Membre
Dernière intervention
18 septembre 2008
18 sept. 2008 à 09:04
18 sept. 2008 à 09:04
Bonjour Jipicy,
Effectivement, ce n'est pas très clair. Je suis pas sur de faire mieux. Encore merci de ton aide.
fichier 1 ou les informations sont liées en colonne , il peut y avoir n colonnes (exemple colonne 1 : Workflows RBD1 et FOL1 m'intéressent)
WORKFLOWS|WORKFLOWS|WORKFLOWS|FOLDER|MAPPING
RBD1|RBD1|RBD1|RBD2|TOTO
FOL1|FOL2|FOL3|FOL1|TITI
fichier 2 ./template/buildworkflows.ksh appelé si la premiere ligne de la colonne concerné = workflows( 2 variables à valoriser @@WORKFLOWNAME@@ = RBD1 et @@FOLDERNAME@@ = FOL1)
fichier 3 ./template/buildfolder.ksh appelé su la première ligne de la colonne concerné = FOLDER (2 variables à valoriser
@@WORKFLOWNAME@@ =RBD2 et @@FOLDERNAME@@=FOL1)
fichier 4 ./template/buildmapping.ksh appelé su la première ligne de la colonne concerné = MAPPING (2 variables à valoriser
@@WORKFLOWNAME@@ =TOTO et @@FOLDERNAME@@=TITI)
1 fichier de sortie = buildglobal.ksh
Une fois les n colonnes traitées, le résultat de sortie est un fichier concaténé p * fichier2 valorisé + q * fichier3 valorisé + r * fichier4 valorisé (ou p + q + r = n)
exemple avec les 5 colonnes (3 workflows, 1 folder, 1 mapping)
#------------------------------------------------------------------------------
# AJOUT DU WORKFLOW RBD1.FOL1 A L'ESPACE DE STOCKAGE
#------------------------------------------------------------------------------
FOLDERNAME=RBD1
WORKFLOWNAME=FOL1
....
#------------------------------------------------------------------------------
# AJOUT DU WORKFLOW RBD1.FOL2 A L'ESPACE DE STOCKAGE
#------------------------------------------------------------------------------
FOLDERNAME=RBD1
WORKFLOWNAME=FOL2
....
#------------------------------------------------------------------------------
# AJOUT DU WORKFLOW RBD1.FOL3 A L'ESPACE DE STOCKAGE
#------------------------------------------------------------------------------
FOLDERNAME=RBD1
WORKFLOWNAME=FOL3
....
#------------------------------------------------------------------------------
# AJOUT DU FOLDER RBD2.FOL1 A L'ESPACE DE STOCKAGE
#------------------------------------------------------------------------------
FOLDERNAME=RBD1
WORKFLOWNAME=FOL3
...
#------------------------------------------------------------------------------
# AJOUT DU MAPPING TOTO.TITI A L'ESPACE DE STOCKAGE
#------------------------------------------------------------------------------
FOLDERNAME=TOTO
WORKFLOWNAME=TITI
....
PS : j'ai essayé d'inverser le fichier d'entrée mais je n'y arrive pas mieux afin d'obtenir 3 colonnes et n lignes plutôt que 3 lignes et n colonnes.
Effectivement, ce n'est pas très clair. Je suis pas sur de faire mieux. Encore merci de ton aide.
fichier 1 ou les informations sont liées en colonne , il peut y avoir n colonnes (exemple colonne 1 : Workflows RBD1 et FOL1 m'intéressent)
WORKFLOWS|WORKFLOWS|WORKFLOWS|FOLDER|MAPPING
RBD1|RBD1|RBD1|RBD2|TOTO
FOL1|FOL2|FOL3|FOL1|TITI
fichier 2 ./template/buildworkflows.ksh appelé si la premiere ligne de la colonne concerné = workflows( 2 variables à valoriser @@WORKFLOWNAME@@ = RBD1 et @@FOLDERNAME@@ = FOL1)
fichier 3 ./template/buildfolder.ksh appelé su la première ligne de la colonne concerné = FOLDER (2 variables à valoriser
@@WORKFLOWNAME@@ =RBD2 et @@FOLDERNAME@@=FOL1)
fichier 4 ./template/buildmapping.ksh appelé su la première ligne de la colonne concerné = MAPPING (2 variables à valoriser
@@WORKFLOWNAME@@ =TOTO et @@FOLDERNAME@@=TITI)
1 fichier de sortie = buildglobal.ksh
Une fois les n colonnes traitées, le résultat de sortie est un fichier concaténé p * fichier2 valorisé + q * fichier3 valorisé + r * fichier4 valorisé (ou p + q + r = n)
exemple avec les 5 colonnes (3 workflows, 1 folder, 1 mapping)
#------------------------------------------------------------------------------
# AJOUT DU WORKFLOW RBD1.FOL1 A L'ESPACE DE STOCKAGE
#------------------------------------------------------------------------------
FOLDERNAME=RBD1
WORKFLOWNAME=FOL1
....
#------------------------------------------------------------------------------
# AJOUT DU WORKFLOW RBD1.FOL2 A L'ESPACE DE STOCKAGE
#------------------------------------------------------------------------------
FOLDERNAME=RBD1
WORKFLOWNAME=FOL2
....
#------------------------------------------------------------------------------
# AJOUT DU WORKFLOW RBD1.FOL3 A L'ESPACE DE STOCKAGE
#------------------------------------------------------------------------------
FOLDERNAME=RBD1
WORKFLOWNAME=FOL3
....
#------------------------------------------------------------------------------
# AJOUT DU FOLDER RBD2.FOL1 A L'ESPACE DE STOCKAGE
#------------------------------------------------------------------------------
FOLDERNAME=RBD1
WORKFLOWNAME=FOL3
...
#------------------------------------------------------------------------------
# AJOUT DU MAPPING TOTO.TITI A L'ESPACE DE STOCKAGE
#------------------------------------------------------------------------------
FOLDERNAME=TOTO
WORKFLOWNAME=TITI
....
PS : j'ai essayé d'inverser le fichier d'entrée mais je n'y arrive pas mieux afin d'obtenir 3 colonnes et n lignes plutôt que 3 lignes et n colonnes.
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
18 sept. 2008 à 18:51
18 sept. 2008 à 18:51
Je suis désolé mais c'est encore moins clair que la 1ère fois ;-((
Bon c'est ok pour le fichier1
Par contre à quoi ressemble tes fichiers et tes variables à changer dans ces fichiers ./template/xxxxxxxxx.ksh ???
Exemple fichier template AVANT => APRÈS
Bon c'est ok pour le fichier1
Par contre à quoi ressemble tes fichiers et tes variables à changer dans ces fichiers ./template/xxxxxxxxx.ksh ???
Exemple fichier template AVANT => APRÈS
Merci à Jipicy pour sa patience. Ce forum est génial.
J'ai trouvé une solution qui consiste à inverser le fichier de $TabETL_PWCT vers $TabETL_PWCT_modif
(peut être pas la plus élégante mais ça marche).
awk 'BEGIN { FS="|"}
{if (NR==1)
{ for (i=1;i<=NF;i++)
{
if ($i=="WORKFLOW") {type[i]="WORKFLOW"}
if ($i=="FOLDER") {type[i]="FOLDER"}
if ($i=="MAPPING") {type[i]="MAPPING"}
NBCOL=NF
}
}
}
{if (NR==2)
{ for (i=1;i<=NBCOL;i++)
workflowName[i]=$i
}
}
{if (NR==3)
{ for (i=1;i<=NBCOL;i++)
folderName[i]=$i
}
}
END { for (i=1;i<=NBCOL;i++)
printf("%s,%s,%s\n",type[i],workflowName[i],folderName[i])
}
' $TabETL_PWCT >> $TabETL_PWCT_modif
cat $TabETL_PWCT_modif | while read ligne
do
type=`echo $ligne | awk -F "," '{print $1}'`
folderName=`echo $ligne | awk -F "," '{print $2}'`
workflowName=`echo $ligne | awk -F "," '{print $3}'`
if [ $type == "FOLDER" ]
then
sed -e "s/@@FOLDERNAME@@/$folderName/g" -e "s/@@WORKFLOWNAME@@/$workflowName/g" $templateDir/DLVR_BUILD_PCRS_FOLDER.txt >> $BuildScript
fi
if [ $type == "WORKFLOW" ]
then
sed -e "s/@@FOLDERNAME@@/$folderName/g" -e "s/@@WORKFLOWNAME@@/$workflowName/g" $templateDir/DLVR_BUILD_PCRS_WORKFLOW.txt >> $BuildScript
fi
if [ $type == "MAPPING" ]
then
sed -e "s/@@FOLDERNAME@@/$folderName/g" -e "s/@@WORKFLOWNAME@@/$workflowName/g" $templateDir/DLVR_BUILD_PCRS_MAPPING.txt >> $BuildScript
fi
done
J'ai trouvé une solution qui consiste à inverser le fichier de $TabETL_PWCT vers $TabETL_PWCT_modif
(peut être pas la plus élégante mais ça marche).
awk 'BEGIN { FS="|"}
{if (NR==1)
{ for (i=1;i<=NF;i++)
{
if ($i=="WORKFLOW") {type[i]="WORKFLOW"}
if ($i=="FOLDER") {type[i]="FOLDER"}
if ($i=="MAPPING") {type[i]="MAPPING"}
NBCOL=NF
}
}
}
{if (NR==2)
{ for (i=1;i<=NBCOL;i++)
workflowName[i]=$i
}
}
{if (NR==3)
{ for (i=1;i<=NBCOL;i++)
folderName[i]=$i
}
}
END { for (i=1;i<=NBCOL;i++)
printf("%s,%s,%s\n",type[i],workflowName[i],folderName[i])
}
' $TabETL_PWCT >> $TabETL_PWCT_modif
cat $TabETL_PWCT_modif | while read ligne
do
type=`echo $ligne | awk -F "," '{print $1}'`
folderName=`echo $ligne | awk -F "," '{print $2}'`
workflowName=`echo $ligne | awk -F "," '{print $3}'`
if [ $type == "FOLDER" ]
then
sed -e "s/@@FOLDERNAME@@/$folderName/g" -e "s/@@WORKFLOWNAME@@/$workflowName/g" $templateDir/DLVR_BUILD_PCRS_FOLDER.txt >> $BuildScript
fi
if [ $type == "WORKFLOW" ]
then
sed -e "s/@@FOLDERNAME@@/$folderName/g" -e "s/@@WORKFLOWNAME@@/$workflowName/g" $templateDir/DLVR_BUILD_PCRS_WORKFLOW.txt >> $BuildScript
fi
if [ $type == "MAPPING" ]
then
sed -e "s/@@FOLDERNAME@@/$folderName/g" -e "s/@@WORKFLOWNAME@@/$workflowName/g" $templateDir/DLVR_BUILD_PCRS_MAPPING.txt >> $BuildScript
fi
done
asevere
Messages postés
13084
Date d'inscription
lundi 28 janvier 2002
Statut
Webmaster
Dernière intervention
3 février 2022
426
22 sept. 2008 à 14:32
22 sept. 2008 à 14:32
Effectivement, c'est plus logique, d'avoir les données par lignes que par colonnes sachant que awk, sed & Cie travaillent sur des lignes et non sur des colonnes.
Ceci dit, une petite suggestion pour convertir le fichier:
Ensuite, on utilise sed pour remplacer les pipes par des retour chariots dnas les fichier tmp_split-* (sed n'est pas obligatoire, mais là, c'est un moyen rapide de faire la transformation sans generer trop de fichier temporaire)
Enfin, on recolle les fichiers tmp_split* et on nettoie le repertoire courant.
C'est a mon avis plus rapide que awk (je n'ai pas tester, mais je le pré-sent) et c'est en tout cas plus lisible que ta manip ;-)
Ceci dit, une petite suggestion pour convertir le fichier:
split -l1 fichier.txt tmp_split- sed -i 's/|/\ /g' tmp_split-* paste -d'|' tmp_split-* >fichier.res rm -f tmp_split-*On commence par faire un split du fichier en précisant de couper toues les "une ligne" et de placer le resultat dans tmp_split-aa(ab, ac, ad, etc.)
Ensuite, on utilise sed pour remplacer les pipes par des retour chariots dnas les fichier tmp_split-* (sed n'est pas obligatoire, mais là, c'est un moyen rapide de faire la transformation sans generer trop de fichier temporaire)
Enfin, on recolle les fichiers tmp_split* et on nettoie le repertoire courant.
C'est a mon avis plus rapide que awk (je n'ai pas tester, mais je le pré-sent) et c'est en tout cas plus lisible que ta manip ;-)