Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1470 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1349474
chtite_mag​uette
Posté le 19-04-2006 à 11:39:55  profilanswer
 

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

mood
Publicité
Posté le 19-04-2006 à 11:39:55  profilanswer
 

n°1349475
Elmoricq
Modérateur
Posté le 19-04-2006 à 11:40:41  profilanswer
 

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

n°1349492
chtite_mag​uette
Posté le 19-04-2006 à 11:46:38  profilanswer
 

script shell unix ksh

n°1349498
Elmoricq
Modérateur
Posté le 19-04-2006 à 11:50:13  profilanswer
 

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

n°1349507
chtite_mag​uette
Posté le 19-04-2006 à 11:54:36  profilanswer
 

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

n°1349510
Elmoricq
Modérateur
Posté le 19-04-2006 à 11:56:15  profilanswer
 

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

n°1349513
chtite_mag​uette
Posté le 19-04-2006 à 11:57:59  profilanswer
 

Merci beaucoup

n°1349522
chtite_mag​uette
Posté le 19-04-2006 à 12:03:49  profilanswer
 

A quoi correspond le %s\n

n°1349536
Elmoricq
Modérateur
Posté le 19-04-2006 à 12:15:05  profilanswer
 

%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)

n°1349546
chtite_mag​uette
Posté le 19-04-2006 à 12:27:43  profilanswer
 

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

mood
Publicité
Posté le 19-04-2006 à 12:27:43  profilanswer
 

n°1349623
chtite_mag​uette
Posté le 19-04-2006 à 14:19:20  profilanswer
 

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

n°1349877
Sve@r
Posté le 19-04-2006 à 17:01:17  profilanswer
 

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.
n°1349938
chtite_mag​uette
Posté le 19-04-2006 à 17:40:53  profilanswer
 

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

n°1350008
Sve@r
Posté le 19-04-2006 à 19:14:01  profilanswer
 

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.
n°1350062
Elmoricq
Modérateur
Posté le 19-04-2006 à 20:33:02  profilanswer
 

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
n°1350199
chtite_mag​uette
Posté le 20-04-2006 à 08:46:50  profilanswer
 

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


 

n°1350201
chtite_mag​uette
Posté le 20-04-2006 à 08:48:51  profilanswer
 

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?

n°1350211
chtite_mag​uette
Posté le 20-04-2006 à 09:06:26  profilanswer
 

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

n°1350299
Sve@r
Posté le 20-04-2006 à 11:16:45  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

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

 

Sujets relatifs
Afficher un fichier puis forcer son downloadAlignement a la ligne des div
Traitement d'un fichier dans BDD Mysqltrouver le path d'un fichier excel
Importation fichier .sqlWindev export fichier SQL ???
[AIDE] Fichier executableprogramation de base (ajout d'utilisateur)
Champ de récupuration d'un fichierParser un fichier Atom XML ?
Plus de sujets relatifs à : Ajout de caractère en tête de ligne d'un fichier


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR