Ajout de caractère en tête de ligne d'un fichier

Ajout de caractère en tête de ligne d'un fichier - Shell/Batch - Programmation

Marsh Posté le 19-04-2006 à 11:39:55    

Bonjour,
 
j'ai un fichier texte et je dois rajouter en tête de chaque ligne une chaine de caractère. Quelle fonction utiliser? Je ne trouve pas comment faire.
 
Comment recuperer certains caractères de la première ligne d'un fichier (genre du 10ème au 15ème caractère)?
 
Merci

Reply

Marsh Posté le 19-04-2006 à 11:39:55   

Reply

Marsh Posté le 19-04-2006 à 11:40:41    

C'est en quoi ? Batch DOS/Windows ? Script shell Unix ?
Dans le second cas, quel shell ?

Reply

Marsh Posté le 19-04-2006 à 11:46:38    

script shell unix ksh

Reply

Marsh Posté le 19-04-2006 à 11:50:13    

chtite_maguette a écrit :

j'ai un fichier texte et je dois rajouter en tête de chaque ligne une chaine de caractère. Quelle fonction utiliser? Je ne trouve pas comment faire.


 
Il suffit d'utiliser les redirections, type :
echo "machin" > nouveau_fichier
cat fichier >> nouveau_fichier
mv nouveau_fichier fichier
 
 

chtite_maguette a écrit :

Comment recuperer certains caractères de la première ligne d'un fichier (genre du 10ème au 15ème caractère)?


 
Conjonction des commandes head et cut :
head -1 fichier | cut -c10-15

Reply

Marsh Posté le 19-04-2006 à 11:54:36    

Pour le premier je dois ajouter une chaine de caractère devant chaque ligne de mon fichier et pas que la première ligne. COmment je fais pour parcourir les lignes

Reply

Marsh Posté le 19-04-2006 à 11:56:15    

chtite_maguette a écrit :

Pour le premier je dois ajouter une chaine de caractère devant chaque ligne de mon fichier et pas que la première ligne. COmment je fais pour parcourir les lignes


 
Ah ok.
 
Dans ce cas-là, awk est ton ami :
 

awk '{ printf("chaîne à ajouter %s\n", $0) }' fichier > nouveau_fichier

Reply

Marsh Posté le 19-04-2006 à 11:57:59    

Merci beaucoup

Reply

Marsh Posté le 19-04-2006 à 12:03:49    

A quoi correspond le %s\n

Reply

Marsh Posté le 19-04-2006 à 12:15:05    

%s indique que l'on va insérer une chaîne de caractères. Comme c'est le premier %... de notre chaîne, printf() prendra la première variable, ici $0, et l'insérera à la place du %s
 
\n sert à marquer un saut de ligne
 
Si mes explications ne sont pas claires, tu trouveras tout ce dont tu as besoin avec :
man printf
 
(sachant que le printf() de awk est similaire à la commande printf d'Unix, et à la fonction homonyme en langage C)

Reply

Marsh Posté le 19-04-2006 à 12:27:43    

Et si ma chaine de caractère à ajouter est contenu dans une variable comment ca marche pour la synthaxe

Reply

Marsh Posté le 19-04-2006 à 12:27:43   

Reply

Marsh Posté le 19-04-2006 à 14:19:20    

ESt ce que ca, ca devrait marcher car j'y arrive pas
 
TITRE="chaîne à ajouter %s\n"
awk '{ printf($TITRE, $0) }' $CURRENTDIR/tmp.txt > $CURRENTDIR/$nomFichierDefaut

Reply

Marsh Posté le 19-04-2006 à 17:01:17    

chtite_maguette a écrit :

ESt ce que ca, ca devrait marcher car j'y arrive pas
 
TITRE="chaîne à ajouter %s\n"
awk '{ printf($TITRE, $0) }' $CURRENTDIR/tmp.txt > $CURRENTDIR/$nomFichierDefaut


 
Ne mélange pas dans tes variables ce qui est "relatif à ton besoin" et ce qui est "relatif à la syntaxe imposée"
Le "printf()" veut du "%s", ça c'est imposé. En revanche, ta chaîne à ajouter c'est toi qui la décide et c'est libre. Sépares-donc les deux...


TITRE="chaîne à ajouter"
awk '{ printf("${TITRE}%s\n", $0) }' $CURRENTDIR/tmp.txt > $CURRENTDIR/$nomFichierDefaut


Si tu te demandes pourquoi on met "$TITRE" directement et "$0" à travers "%s", c'est parce que "TITRE" est une variable shell et "$0" une variable traitée dans le awk.
 
En fait, le shell traduira "$TITRE" avant de le passer à "awk" et "awk" verra ceci:

awk '{ printf("chaîne à ajouter%s\n", $0) }' $CURRENTDIR/tmp.txt > $CURRENTDIR/$nomFichierDefaut


Message édité par Sve@r le 19-04-2006 à 17:08:37

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 19-04-2006 à 17:40:53    

J'ai fait ca :
 
awk '{ printf("$TITRE %s\n", $0) }' $CURRENTDIR/tmp.txt > $CURRENTDIR/$nomFichierDefaut
 
Et il ne remplace pas $TITRE

Reply

Marsh Posté le 19-04-2006 à 19:14:01    

chtite_maguette a écrit :

J'ai fait ca :
 
awk '{ printf("$TITRE %s\n", $0) }' $CURRENTDIR/tmp.txt > $CURRENTDIR/$nomFichierDefaut
 
Et il ne remplace pas $TITRE


 
Tiens ? C'est étonnant... Donc tu te retrouves avec "$TITRE" devant chaque ligne de "$nomFichierDefaut" ???
J'étais certain que le shell transformait "$TITRE" en sa valeur en appelant awk
 
Puisque cela ne fonctionne pas, alors il faut utiliser l'option "-v" de "awk" pour pouvoir lui faire passer depuis l'extèrieur (le shell) la variable "TITRE"

awk -v TITRE="$TITRE" '{printf("%s %s\n", TITRE, $0) }' $CURRENTDIR/tmp.txt > $CURRENTDIR/$nomFichierDefaut


 
De cette façon, je demande à "awk" de créer une variable que je nomme "TITRE" et de remplir cette variable avec la chaîne issue de la variable shell "$TITRE".
Et dans le "awk", j'affiche avec "%s" la variable "TITRE" créée avec "-v".
Petit détail: Une variable en "awk" ne se nomme pas "$" mais directement avec son nom c'est pourquoi je n'ai pas mis "$TITRE" dans le awk mais "TITRE". Et si tu te poses la question, "$0" ne signifie pas "variable 0" mais "mot n° 0 de la ligne traitée" (avec la convention que le mot n° 0 signifie "toute la ligne traitée" )

Message cité 2 fois
Message édité par Sve@r le 19-04-2006 à 19:14:44

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 19-04-2006 à 20:33:02    

Sve@r a écrit :

Tiens ? C'est étonnant... Donc tu te retrouves avec "$TITRE" devant chaque ligne de "$nomFichierDefaut" ???
J'étais certain que le shell transformait "$TITRE" en sa valeur en appelant awk


 
Le code passé à awk est entre apostrophes ; il n'y a donc pas d'interpolation.

Message cité 2 fois
Message édité par Elmoricq le 19-04-2006 à 20:33:41
Reply

Marsh Posté le 20-04-2006 à 08:46:50    

Sve@r a écrit :

Tiens ? C'est étonnant... Donc tu te retrouves avec "$TITRE" devant chaque ligne de "$nomFichierDefaut" ???
J'étais certain que le shell transformait "$TITRE" en sa valeur en appelant awk
 
Puisque cela ne fonctionne pas, alors il faut utiliser l'option "-v" de "awk" pour pouvoir lui faire passer depuis l'extèrieur (le shell) la variable "TITRE"

awk -v TITRE="$TITRE" '{printf("%s %s\n", TITRE, $0) }' $CURRENTDIR/tmp.txt > $CURRENTDIR/$nomFichierDefaut


 
De cette façon, je demande à "awk" de créer une variable que je nomme "TITRE" et de remplir cette variable avec la chaîne issue de la variable shell "$TITRE".
Et dans le "awk", j'affiche avec "%s" la variable "TITRE" créée avec "-v".
Petit détail: Une variable en "awk" ne se nomme pas "$" mais directement avec son nom c'est pourquoi je n'ai pas mis "$TITRE" dans le awk mais "TITRE". Et si tu te poses la question, "$0" ne signifie pas "variable 0" mais "mot n° 0 de la ligne traitée" (avec la convention que le mot n° 0 signifie "toute la ligne traitée" )


 
 
 
Ca ne fonctionne pas. J'ai une belle erreur
 

Code :
  1. awk: syntax error near line 1
  2. awk: bailing out near line 1


 

Reply

Marsh Posté le 20-04-2006 à 08:48:51    

Elmoricq a écrit :

Le code passé à awk est entre apostrophes ; il n'y a donc pas d'interpolation.


 
Et comment tu fais dans ce cas pour passer un parametre?

Reply

Marsh Posté le 20-04-2006 à 09:06:26    

En fait il fallait utiliser nawk et pas awk dans mon cas

Reply

Marsh Posté le 20-04-2006 à 11:16:45    

Elmoricq a écrit :

Le code passé à awk est entre apostrophes ; il n'y a donc pas d'interpolation.


C'est vrai. J'aurais dû m'en apercevoir tout seul... :jap:
 

chtite_maguette a écrit :

Et comment tu fais dans ce cas pour passer un parametre?


-v !!!
 

chtite_maguette a écrit :

Ca ne fonctionne pas. J'ai une belle erreur
En fait il fallait utiliser nawk et pas awk dans mon cas


Moi je suis sous Linux et le code que j'ai posté fonctionne tel quel avec "awk". Toi tu es en ksh (peut-être sur un système plus ancien comme "Sun" ) et il est donc possible que le "awk" de ton système ne connaisse pas "-v".
Dans ce cas, "nawk" (new awk) ou "gawk" (gnu awk si ton système le connait) est en effet la solution...

nawk -v TITRE="$TITRE" '{printf("%s %s\n", TITRE, $0) }' $CURRENTDIR/tmp.txt > $CURRENTDIR/$nomFichierDefaut


Message édité par Sve@r le 20-04-2006 à 11:23:35

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed