Bonjour
Je travaille sur une extraction d'une base lotus qui se présente sous cette forme:
"","", "", (etc)
"","truc", "",(etc)
"","","",(etc)
"","","",(etc)
"","","",(etc)
.....
"","","",(etc)
"","Machin", "",(etc)
"","","",(etc)
....
"","","",(etc)
"","Chose", "",(etc)
...
comme ceci sur environ 20000 lignes....
J'ai besoin de remplacer , dans toutes les lignes qui suivent la ligne contenant "truc", le deuxième champ "" par "truc" , et ceci jusqu'à rencontrer la ligne contenant "Machin"
et ainsi de suite...
je me suis tapé le FM de sed, awk, grep et consorts, mais je patauge....
Merci de votre aide
# Python pardi
Posté par Julien . Évalué à 0.
-> Python !
# A tester !
Posté par sylvain cresto (site web personnel) . Évalué à 3.
#!/bin/sh
a_remplacer=""
while read data; do
fin=`echo $data | grep '^"[^#]*","Machin"'`
if [ -n "$fin" ] ; then
# Fin du traitement car "Machin" trouvé
a_remplacer=""
echo "$data"
else
if [ -n "$a_remplacer" ] ; then
# Ligne dans laquelle il faut remplacer "" par "truc"
ligne=`echo $data | sed 's/^\("[^"]*",\)\("[^"]*"\)\(.*\)/\1"truc"\3/'`
echo "$ligne"
else
recherche=`echo $data | grep '^"[^"]*","truc"'`
if [ -n "$recherche" ] ; then
# A partir de maintenant il faut remplacer "" par "truc"
a_remplacer="OUI"
fi
echo "$data"
fi
fi
done
et ensuite:
./remplace.sh < fichier_data > fichier_ok
fichier_data = le fichier contenant les données à traiter
fichier_ok = le fichier contenant les données traitées
Après un rapide test et si j'ai bien compris ça semble à peu près faire ce que tu veux, mais bon .. à tester !
# awk bien sur
Posté par anahop . Évalué à 2.
"","","","",""
"","truc","","",""
"","","","",""
"","","","",""
"","","","",""
"","","","",""
"","","","",""
"","","","",""
"","machin","","",""
"","","","",""
"","","","",""
"","","","",""
"","","","",""
"","","","",""
"","chose","","",""
"","","","",""
"","","","",""
et on veut :
"","","","",""
"","truc","","",""
"","truc","","",""
"","truc","","",""
"","truc","","",""
"","truc","","",""
"","truc","","",""
"","truc","","",""
"","machin","","",""
"","machin","","",""
"","machin","","",""
"","machin","","",""
"","machin","","",""
"","machin","","",""
"","chose","","",""
"","chose","","",""
"","chose","","",""
Si c'est bien ça, alors le programme awk suivant le fait :
BEGIN {rempl = "\"\""; FS = ","; OFS = ",";}
{
if ($2 == "\"\"")
$2 = rempl;
else
rempl = $2;
print;
}
[^] # Re: awk bien sur
Posté par harmo . Évalué à 1.
Bon, ya bien un retour chariot indésirable, mais rien de bien grave, je devrais m'en sortir avec sed
(quoique si je trouve la soluce ici .... ;o)
Merci encore (à tous, bien entendu !!)
Michel
# sed!
Posté par IzNoWin . Évalué à 0.
pour une aide efficace je te conseille initiation au script shell ou ton cas est clairement expliquer (d apres un exemple sur le fichier password)
sed est tres efficace malgres une syntaxe hyper chiante
dommage j ai pas le book sous les yeux sinon je me serais fait un plaisir de te faire un .sh
# grep + head + tail + sed
Posté par Mildred (site web personnel) . Évalué à 1.
grep -n 'pattern' 'file' permet de savoir a quelle ligne du fichier se trouve un pattern particulier. Les numéros de lignes sont afichés au début.
dur -d'delimiter' -f1 permet de couper les lignes données en entrée selon le délimiteur donné et de prendre le 1er chanp. Cela permet d'extraire le numéro de ligne de la commande grep.
head -n x permet de récupérer le début d'un fichier en comptant les lignes a partir du début ou de la fin. tail -n x fait la même chose en prenant les dernières lignes d'un fichier
sed permet de faire la substitution.
Avec les expressions régulières, il faut faire attention car le résultat n'est pas toujours très fiable. Ce que je veux dire c'est qu'écrire une regexp qui correspond a une certaine donnée est facile, mais pour s'assurer qu'aucune autre ligne ne correspond pas, c'est moins facile. Cela dépend de tes données en entrée et de ton expression.
Après, c'est vrai que des langages plus évolués comme perl, awk, python, ... sont peut être plus adaptés.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.