Rechercher : dans
Par :

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

Dernière réponse le 25 fév 2009 à 11:43:45 mortelrdv, le 22 fév 2009 à 08:54:13 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « [linux/shell] inserrer texte en début ligne » dans :
Sed - Introduction à SED - Part III VoirSED - The Stream EDitor - Part III Ce document est une introduction à la pratique et à l'utilisation de l'éditeur de flux "SED", qui essaie de couvrir certaines fonctionnalités assez méconnues, pour ne pas dire "quasi inconnues", qui font de "SED"...
Sed - Insertion de texte VoirInsérer du texte dans un fichier Introduction Syntaxe Ajout de texte Insérer une ligne avec "i" Ajouter une ligne avec "a" Échanger une ligne avec "c" Introduction Il est parfois utile de pouvoir insérer du texte en en-tête d'un ou...
Comment lire un fichier ligne par ligne VoirComment lire un fichier ligne par ligne Préambule Boucle while Syntaxe Exemple Astuces Bonus Boucle for Syntaxe Préambule Une des erreurs les plus communes dans l'apprentissage des scripts "bash" sous GNU/LInux pour lire un fichier...
Linux - L'éditeur Vi VoirIntroduction à Vi Vi est un des éditeurs de texte les plus populaires sous les systèmes de type Unix (avec Emacs et pico) malgré son ergonomie très limitée. Sous Linux il existe une version libre de Vi appelée Vim (Vi Improved). Vi (prononcez...
Linux - Le shell VoirIntroduction au shell L'interpréteur de commandes est l'interface entre l'utilisateur et le système d'exploitation, d'où son nom anglais «shell», qui signifie «coquille». Le shell est ainsi chargé de faire l'intermédiaire le système...
Commandes Linux VoirTableau des principales commandes Linux Commande Description équivalent DOS ls liste le contenu d'un répertoire dir cd change de répertoire cd cd .. répertoire parent cd.. mkdir crée un nouveau...

1

dubcek, le 22 fév 2009 à 09:48:41

Hello
sed 's/^/VCC;/' < fichier_in > fichier_out

Répondre à dubcek

2

lami20j, le 22 fév 2009 à 10:33:37

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
106485010510997108

Répondre à lami20j

3

dubcek, le 22 fév 2009 à 10:45:10

Et si c'est une machine SunOS et pas Solaris, elle doit être plutôt ancienne

Répondre à dubcek

4

lami20j, le 22 fév 2009 à 10:57:10

Salut,

Je compare avec ça ça prend environ 3mn chez moi, core2duo 6600,. 106485010510997108

Répondre à lami20j

5

dubcek, le 22 fév 2009 à 11:49:20

Et comparer sed et awk , que dit
time awk '{printf("VCC;%s\n", $0)}' < fichier_in > fichier_out

Répondre à dubcek

6

lami20j, le 22 fév 2009 à 12:08:24

Re,

lami20j@debian:~/sda7$ time awk '{printf("VCC;%s\n", $0)}' <mortelrdv>mortelrdv.OUT3

real    0m1.630s
user    0m0.808s
sys     0m0.548s
106485010510997108

Répondre à lami20j

7

mortelrdv, le 24 fév 2009 à 20:57:22

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)

Répondre à mortelrdv

8

dubcek, le 25 fév 2009 à 08:55:11

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

Répondre à dubcek

9

 lami20j, le 25 fév 2009 à 11:43:45

Salut,

As-tu essayé en C?! 106485010510997108

Répondre à lami20j