Ajout de caractère en tête de ligne d'un fichier - Shell/Batch - Programmation
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 ?
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
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
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 |
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)
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
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
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 |
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...
|
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 |
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
Marsh Posté le 19-04-2006 à 19:14:01
chtite_maguette a écrit : J'ai fait ca : |
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" )
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" ??? |
Le code passé à awk est entre apostrophes ; il n'y a donc pas d'interpolation.
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" ???
|
Ca ne fonctionne pas. J'ai une belle erreur
Code :
|
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?
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...
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 |
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 |
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