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   -
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!
Configuration: Windows XP
Firefox 2.0.0.1

3 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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 :-))
    0
    1. enzatto Messages postés 16 Statut Membre
       
      désolé c pas toi oui c gorkimat qui m'avait filé un coup de main.
      que ce soit dit.

      ps: je suis mort de rire "le menteur..." LOL :)
      faut rien laisser au hasard ici!

      pps: mais effectivement si jamais tu te sens en forme pour le 2d round je suis super preneur!
      0
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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.txt
    et en Perl avec une seul ligne

    cat 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 faire

    cat test.txt | perl -ne 'next unless /08\r?$/;s/(.*):(.*):(.*):(.*)(\s+.*08)/$1*3600+$2*60+$3 . ",$4$5"/e;print' > resultat.txt

    0
    1. enzatto Messages postés 16 Statut Membre
       
      RESPECT ULTIME ET INTENSE

      RIEN A DIRE T TROP FORT

      MERCI!!!!
      0
    2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      et en Perl avec une seul ligne
      FAIGNANT ! PERLIEN ! ;-DDD

      Merci pour le "\r" à la place du "\$", mais bon je suis pas tout le temps fourré à la fenêtre de Bill moi ;-)))
      0
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Merci à vous Messieurs :-))
    0