Cygwin - traitement colonnes suite ...et fin?
Résolu
enzatto
Messages postés
16
Statut
Membre
-
lami20j Messages postés 21506 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
lami20j Messages postés 21506 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
Bonjour à tous!
Je suis sous win xp et j'utilise la dernière version de Cygwin (dll 1.5.24-2).
J'ai un grand nombre de fichiers à traiter de 200.000 lignes du style:
12:56:15:000 25/07/2006 0059,7 09
12:56:51:500 25/09/2006 0062,2 08
12:56:52:000 25/07/2006 0057,7 09
12:56:52:500 25/08/2006 0071,9 09
12:56:08:000 25/07/2006 0065,3 15
12:56:15:000 25/07/2006 0057,7 09
12:56:51:500 25/09/2006 0062,2 08
12:56:52:000 08/07/2006 0059,7 09
12:56:52:500 25/08/2006 0071,9 09
12:56:08:000 08/07/2006 0065,7 15
12:56:15:000 25/07/2006 0059,6 09
12:56:51:500 26/09/2006 0062,2 08
12:56:52:000 26/07/2006 0052,7 09
08:56:52:500 26/08/2006 0061,3 09
08:56:08:000 26/07/2006 0045,3 15
donc dans l'ordre heure / date / valeur / type
On est arrivé avec jipicy et lami20j au script nommé trait2 du style
#!/bin/bash
monfich="/home/catto/test.txt"
sed -n '/08$/p' $monfich > tmp.txt
while read ligne
do
#read ligne
if [ "$ligne" = "" ]
then break
fi
col=$(echo ${ligne} | awk '{ print $2 " " $3 " "$4 }')
heure=$(echo ${ligne} | awk -F: '{ print $1 }')
minute=$(echo ${ligne} | awk -F: '{ print $2 }')
seconde=$(echo ${ligne} | awk -F: '{ print $3 }')
mseconde=$(echo ${ligne} | awk -F: '{ print $4 }' | awk '{ print $1 }')
somme="$(($heure*3600+$minute*60+$seconde)),$mseconde"
echo "$somme $col" >> ${monfich}.out
done < tmp.txt
rm -f tmp.txt
qui me renvoie
: No such file or directory
./trait2: line 17: syntax error near unexpected token 'done'
'/trait2: line 17: 'done < tmp.txt
Le but de ce programme est de renvoyer un fichier monfich_trait.txt
du style
temps (en secondes) / date / valeur
en ne gardant que les ligne de type 08 (dernière colonne)
pour information, en mode débogage on obtient:
$ sh -xv trait2
#!/bin/bash
monfich="/home/catto/test.txt"
+ monfich=$'/home/catto/test.txt\r'
sed -n '/08$/p' $monfich > tmp.txt
+ sed -n '/08$/p' $'monfich > tmp.txt\r'
: No such file or directory
while read ligne
do
#read ligne
if [ "$ligne" = "" ]
then break
fi
col=$(echo ${ligne} | awk '{ print $2 " " $3 " "$4 }')
heure=$(echo ${ligne} | awk -F: '{ print $1 }')
minute=$(echo ${ligne} | awk -F: '{ print $2 }')
seconde=$(echo ${ligne} | awk -F: '{ print $3 }')
mseconde=$(echo ${ligne} | awk -F: '{ print $4 }' | awk '{ print $1 }')
somme="$(($heure*3600+$minute*60+$seconde)),$mseconde"
echo "$somme $col" >> ${monfich}.out
done < tmp.txt
rm -f tmp.txt
trait2: line 17: syntax error near unexpected token 'done'
'rait2: line 17: 'done < tmp.txt
Voilà! Avis aux amateurs!
j'aurais bien besoin d'un coup de main...
Cela vient-il de ma version de Cygwin?
Merci beaucoup de votre aide à tous en tous cas!
je dois partir en déplacement ce soir et demain mais je suis de retour dès vendredi matin donc ne vous étonnez pas si je répond pas tout de suite...
MERCI ENCORE!
Je suis sous win xp et j'utilise la dernière version de Cygwin (dll 1.5.24-2).
J'ai un grand nombre de fichiers à traiter de 200.000 lignes du style:
12:56:15:000 25/07/2006 0059,7 09
12:56:51:500 25/09/2006 0062,2 08
12:56:52:000 25/07/2006 0057,7 09
12:56:52:500 25/08/2006 0071,9 09
12:56:08:000 25/07/2006 0065,3 15
12:56:15:000 25/07/2006 0057,7 09
12:56:51:500 25/09/2006 0062,2 08
12:56:52:000 08/07/2006 0059,7 09
12:56:52:500 25/08/2006 0071,9 09
12:56:08:000 08/07/2006 0065,7 15
12:56:15:000 25/07/2006 0059,6 09
12:56:51:500 26/09/2006 0062,2 08
12:56:52:000 26/07/2006 0052,7 09
08:56:52:500 26/08/2006 0061,3 09
08:56:08:000 26/07/2006 0045,3 15
donc dans l'ordre heure / date / valeur / type
On est arrivé avec jipicy et lami20j au script nommé trait2 du style
#!/bin/bash
monfich="/home/catto/test.txt"
sed -n '/08$/p' $monfich > tmp.txt
while read ligne
do
#read ligne
if [ "$ligne" = "" ]
then break
fi
col=$(echo ${ligne} | awk '{ print $2 " " $3 " "$4 }')
heure=$(echo ${ligne} | awk -F: '{ print $1 }')
minute=$(echo ${ligne} | awk -F: '{ print $2 }')
seconde=$(echo ${ligne} | awk -F: '{ print $3 }')
mseconde=$(echo ${ligne} | awk -F: '{ print $4 }' | awk '{ print $1 }')
somme="$(($heure*3600+$minute*60+$seconde)),$mseconde"
echo "$somme $col" >> ${monfich}.out
done < tmp.txt
rm -f tmp.txt
qui me renvoie
: No such file or directory
./trait2: line 17: syntax error near unexpected token 'done'
'/trait2: line 17: 'done < tmp.txt
Le but de ce programme est de renvoyer un fichier monfich_trait.txt
du style
temps (en secondes) / date / valeur
en ne gardant que les ligne de type 08 (dernière colonne)
pour information, en mode débogage on obtient:
$ sh -xv trait2
#!/bin/bash
monfich="/home/catto/test.txt"
+ monfich=$'/home/catto/test.txt\r'
sed -n '/08$/p' $monfich > tmp.txt
+ sed -n '/08$/p' $'monfich > tmp.txt\r'
: No such file or directory
while read ligne
do
#read ligne
if [ "$ligne" = "" ]
then break
fi
col=$(echo ${ligne} | awk '{ print $2 " " $3 " "$4 }')
heure=$(echo ${ligne} | awk -F: '{ print $1 }')
minute=$(echo ${ligne} | awk -F: '{ print $2 }')
seconde=$(echo ${ligne} | awk -F: '{ print $3 }')
mseconde=$(echo ${ligne} | awk -F: '{ print $4 }' | awk '{ print $1 }')
somme="$(($heure*3600+$minute*60+$seconde)),$mseconde"
echo "$somme $col" >> ${monfich}.out
done < tmp.txt
rm -f tmp.txt
trait2: line 17: syntax error near unexpected token 'done'
'rait2: line 17: 'done < tmp.txt
Voilà! Avis aux amateurs!
j'aurais bien besoin d'un coup de main...
Cela vient-il de ma version de Cygwin?
Merci beaucoup de votre aide à tous en tous cas!
je dois partir en déplacement ce soir et demain mais je suis de retour dès vendredi matin donc ne vous étonnez pas si je répond pas tout de suite...
MERCI ENCORE!
Configuration: Windows XP Firefox 2.0.0.1
3 réponses
-
On est arrivé avec <ital>jipicy et lami20j au script nommé trait2 du style </ital>
Le menteur :-))
Je n'ai rien fait pour l'instant.
The second round is for me :-)) -
Salut,
voici ma promesse
Sous GNU/Linux Debian$ cat enzatto.sh #!/bin/bash monfich="/home/lami20j/trash/test.txt" sed -n '/08$/p' $monfich > tmp.txt while read ligne do #read ligne if [ "$ligne" = "" ] then break fi col=$(echo ${ligne} | awk '{ print $2 " " $3 " "$4 }') heure=$(echo ${ligne} | awk -F: '{ print $1 }') minute=$(echo ${ligne} | awk -F: '{ print $2 }') seconde=$(echo ${ligne} | awk -F: '{ print $3 }') mseconde=$(echo ${ligne} | awk -F: '{ print $4 }' | awk '{ print $1 }') somme="$(($heure*3600+$minute*60+$seconde)),$mseconde" echo "$somme $col" >> ${monfich}.out done < tmp.txt rm -f tmp.txt $ sh enzatto.sh $ cat test.txt.out 46611,500 25/09/2006 0062,2 08 46611,500 25/09/2006 0062,2 08 $ cat test.txt | perl -ne 'next unless /08\r?$/;s/(.*):(.*):(.*):(.*)(\s+.*08)$/$1*3600+$2*60+$3 . ",$4$5"/e;print' 46611,500 25/09/2006 0062,2 08 46611,500 25/09/2006 0062,2 08
Et avec Cygwin
un print screen ici https://www.cjoint.com/?elxoxMYIBn
et le code#!/bin/bash monfich="/home/lamixp/trash/test.txt" sed -n '/08\r/p' $monfich > tmp.txt while read ligne do # read ligne if [ "$ligne" = "" ] then break fi col=$(echo ${ligne} | awk '{ print $2 " " $3 " "$4 }') heure=$(echo ${ligne} | awk -F: '{ print $1 }') minute=$(echo ${ligne} | awk -F: '{ print $2 }') seconde=$(echo ${ligne} | awk -F: '{ print $3 }') mseconde=$(echo ${ligne} | awk -F: '{ print $4 }' | awk '{ print $1 }') somme="$(($heure*3600+$minute*60+$seconde)),$mseconde" echo "$somme $col" >> ${monfich}.out done < tmp.txt rm -f tmp.txtet en Perl avec une seul lignecat test.txt | perl -ne 'next unless /08\r?$/;s/(.*):(.*):(.*):(.*)(\s+.*08)/$1*3600+$2*60+$3 . ",$4$5"/e;print'
Pour redireger dans un fichier il faut fairecat test.txt | perl -ne 'next unless /08\r?$/;s/(.*):(.*):(.*):(.*)(\s+.*08)/$1*3600+$2*60+$3 . ",$4$5"/e;print' > resultat.txt
-
Salut,
Merci à vous Messieurs :-))