[linux/shell] inserrer texte en début ligne

Résolu
Bonjour,

J'ai un fichier CSV de ~70 000 lignes, je souhaiterai inserrer le texte "moco;" en début de ligne.
J'ai fait ceci qui fonctionne :
while read line; do
  echo "VCC;"$line >>$_OUT
done < $_FILE_TMP1


ça prend environ 3mn chez moi, core2duo 6600, pour le faire. mais comme le script va servir au boulot sur un sunOS très lent. (j'avais fait il y a longtemps un autre script pour traiter ces 70 000 lignes pour faire autre chose, find de traitement en 8mn chez moi et 1h20 sur le sunOS. Disque lent ou processeur lent, aucune idée).

Je ne pense pas que je suis pressé mais je me demande s'il n'existerait pas une méthode plus efficace/optimisée pour diminuer le temps de traitement.

Merci pour tout suggestion
Configuration: Windows 2003
Internet Explorer 6.0

8 réponses

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    Salut,

    L'algo est aussi important et il joue sur le temps d'exécution.

    Ton cas
    Tu lis chaque ligne et tu la stockes
    Tu concatenes VCC avec le contenu de la variable
    Tu fait la redirection >> vers le nouveau fichier

    La solution de dubcek
    Il mets au début de chaque ligne VCC
    Le résultat il le mets dans le fichier de sortie

    Un fichier de 70000 ligne ce n'est rien ;-))
    Voici un test de temps pour un fichier d'un 1 000 000 lignes
    lami20j@debian:~/sda7$ cat /proc/cpuinfo|tail -30|head -8
    clflush size    : 64
    power management:
    
    processor       : 1
    vendor_id       : GenuineIntel
    cpu family      : 6
    model           : 15
    model name      : Intel(R) Core(TM)2 Duo CPU     T5450  @ 1.66GHz
    lami20j@debian:~/sda7$ du -sh mortelrdv
    112M    mortelrdv
    lami20j@debian:~/sda7$ wc -l mortelrdv
    1000000 mortelrdv
    lami20j@debian:~/sda7$ time while read line;do echo "VCC;"$line >> mortelrdv.OUT; done < mortelrdv
    
    real    0m58.677s
    user    0m44.995s
    sys     0m13.681s
    lami20j@debian:~/sda7$ time sed 's/^/VCC;/' <mortelrdv>mortelrdv.OUT2
    
    real    0m1.624s
    user    0m1.108s
    sys     0m0.464s
    
    1. Contributeur
      et si c'est une machine SunOS et pas Solaris, elle doit être plutôt ancienne
      1. Modérateur
        Salut,

        Je compare avec ça ça prend environ 3mn chez moi, core2duo 6600,.
    2. Contributeur
      et comparer sed et awk , que dit
      time awk '{printf("VCC;%s\n", $0)}' < fichier_in > fichier_out
      1. Modérateur
        Re,
        lami20j@debian:~/sda7$ time awk '{printf("VCC;%s\n", $0)}' <mortelrdv>mortelrdv.OUT3
        
        real    0m1.630s
        user    0m0.808s
        sys     0m0.548s
        
        1. Merci pour vos suggestion.

          Je vais passer par awk car je voudrais ajouter quelques operations.

          PS : Maintenant que j'y pense, dans le script qui a duré 1h sur un sunOs, je me demande s'il l'accès disque n'y serait pas pour quelque chose car je fais quelque chose comme 70000x(ecriture puis effacement, d'un petit fichier de 2ko)
          1. Contributeur
            certainement, cette opération, c'est beaucoup d'I/O et peu de cpu
            mais sed et awk lisent le fichier d'un coup alors que la boucle while read traite ligne après ligne et en shell