variables à base d'un fichier en input

variables à base d'un fichier en input - Shell/Batch - Programmation

Marsh Posté le 28-11-2008 à 00:23:53    

Salut à tous,
je dispose d'un fichier de data comme input, il contient trois colonnes de données, les trois valeurs de chaque ligne de ce fichier seront exploitées par la suite pour construire un fichier de commandes..
file_type:
06485 123456 11/09/08
06386 09856 08/01/07
.
.
.
etc
 
donc j'ouvre le file_type:
cat file_type| awk '/^[ 0-9]+$/{printf("object.modify,NBR=\"%s\",serial=\"%s\",DATE="$3 ";\n", $1,$2,$3)}' > commands
j'imagine que c'est pas correct..
 
le but est que mon fichier résultat (commands) soit rempli ainsi:
à partir de la 1ère ligne du fichier file_type par exple, il faudrait construire la commande suivante:
object.modify,NBR="06485",serial="123456",DATE="11/09/08";
idem pour la 2ème ligne du fichier file_type:
object.modify,NBR="06386",serial="09856",DATE="08/01/07";
 
le problème qui se pose à moi, est commment traduire ça et comment renseigner les $1,$2,$3...
 
Merci d'avance.

Reply

Marsh Posté le 28-11-2008 à 00:23:53   

Reply

Marsh Posté le 28-11-2008 à 12:00:33    

Donc, c'est de l'Unix.
 
Renseigner $1, $2, $3... qui sont sur la ligne du awk ?
L'utilitaire awk découpe chaque ligne en plusieurs champs nommés $1, $2, etc.
Le découpage se base sur le sépateur de champ. Par défaut, c'est l'espace. Mais il est possible de changer ce séprateur.
Donc l'alimentation de $1, $2, $3 est automatiquement réalisée par awk si on lui fourni des lignes contenant des données séparées par un séparateur.
 
Je ne sais pas si cela vous aide. Sinon, pourriez-vous expliquer plus précisément où se situe le problème, si c'est un problème de conception de l'agorithme, ou si c'est le choix des outils Unix (awk ou cut, et cat ou autre), où si c'est la programmation ?

Reply

Marsh Posté le 28-11-2008 à 12:47:57    

Reply

Marsh Posté le 28-11-2008 à 14:12:56    

Il semble que la solution n'ait pas été trouvée chez Developpez. Peut-être que les forumeurs seraient plus forts chez HFR.
 
Je propose :
 
1. Supprimer le cat qui ne sert à rien, car awk marche bien avec un fichier qui lui est passé normalement sans un cat et un pipe avant.
2. Supprimer le filtre au début de la commande awk qui a l'air de poser un problème. Si on veut filter, on peut le faire dans les accolades du awk, ce sera plus lisible, ou bien par un grep avant de donner le fichier à awk.
 
Donc, la solution serait :

awk
{
    printf("object.modify,NBR=\"%s\",serial=\"%s\",DATE="$3 ";\n", $1,$2,$3)
} ' file_type

Reply

Marsh Posté le 28-11-2008 à 18:07:33    

olivthill a écrit :

1. Supprimer le cat qui ne sert à rien, car awk marche bien avec un fichier qui lui est passé normalement sans un cat et un pipe avant.


C'est une bonne remarque (mais pas liée au problème en question)

olivthill a écrit :

2. Supprimer le filtre au début de la commande awk qui a l'air de poser un problème. Si on veut filter, on peut le faire dans les accolades du awk, ce sera plus lisible, ou bien par un grep avant de donner le fichier à awk.


Alors ça par contre c'est un très mauvais conseil. Le filtrage est très bien où il est. C'est ainsi que awk est sensé fonctionner. Pour ce qui est du grep, ça me hérisse les poils quand je vois un grep avant un awk...

Message cité 1 fois
Message édité par matafan le 28-11-2008 à 18:07:58
Reply

Marsh Posté le 28-11-2008 à 19:44:30    

olivthill a écrit :

Il semble que la solution n'ait pas été trouvée chez Developpez. Peut-être que les forumeurs seraient plus forts chez HFR.
 
Je propose :
 
1. Supprimer le cat qui ne sert à rien, car awk marche bien avec un fichier qui lui est passé normalement sans un cat et un pipe avant.
2. Supprimer le filtre au début de la commande awk qui a l'air de poser un problème. Si on veut filter, on peut le faire dans les accolades du awk, ce sera plus lisible, ou bien par un grep avant de donner le fichier à awk.
 
Donc, la solution serait :

awk
{
    printf("object.modify,NBR=\"%s\",serial=\"%s\",DATE="$3 ";\n", $1,$2,$3)
} ' file_type



 
1- quand j'éxécutais la commande indiquée dans mon premier message, le fichier commands reste vide...
2- je voulais renseigner un champ supplémentaire:
 
serv='test'
cat file_type| awk '/^[ 0-9]+$/{printf("object.modify,NBR=\"%s\",SERV=\"'${serv}'\",serial=\"%s\",DATE="$3 ";\n", $1,$2,$3)}' > commands
 
ERREUR ---> String in Line1
 
je comprends pas !
 
je vous remercie pour vos réponses
 
 

Reply

Marsh Posté le 28-11-2008 à 19:49:26    

matafan a écrit :


C'est une bonne remarque (mais pas liée au problème en question)


 

matafan a écrit :


Alors ça par contre c'est un très mauvais conseil. Le filtrage est très bien où il est. C'est ainsi que awk est sensé fonctionner. Pour ce qui est du grep, ça me hérisse les poils quand je vois un grep avant un awk...


 
D'aprés matafan, le "/" dans la partie date risque de créer problème pour le matching...donc j'imagine la necessité de mettre un filtre...

Reply

Marsh Posté le 28-11-2008 à 19:52:13    

stmasnam a écrit :

D'aprés matafan, le "/" dans la partie date risque de créer problème pour le matching...donc j'imagine la necessité de mettre un filtre...


:heink: Non pas du tout, où est-ce que j'ai dis ça ?

Reply

Marsh Posté le 28-11-2008 à 20:46:44    

matafan a écrit :


:heink: Non pas du tout, où est-ce que j'ai dis ça ?


 
Ce que tu fais est correct, sauf que /^[ 0-9]+$/ ne va pas matcher puisque tu as des / dans ta ligne. Suivant ce que tu veux matcher, tu peux faire par exemple /^[ 0-9/]+$/, ou bien /^[ 0-9]+/...

Reply

Marsh Posté le 28-11-2008 à 22:32:14    

Avec ton expression awk oui, pas avec la mienne. Le / dans la ligne n'est pas un problème, mais il faut juste que le filtre en tienne compte.

Reply

Marsh Posté le 28-11-2008 à 22:32:14   

Reply

Marsh Posté le 28-11-2008 à 22:50:29    

une ptite question pour DATE:
 
cat file_type| awk '/^[ 0-9]+$/{printf("object.modify,NBR=\"%s\",SERV=\"'${serv}'\",serial=\"%s\",DATE="$3 ";\n", $1,$2,$3)}' > commands  
 
ou bien
 
cat file_type| awk '/^[ 0-9]+$/{printf("object.modify,NBR=\"%s\",SERV=\"'${serv}'\",serial=\"%s\",DATE=\"%s\";\n", $1,$2,$3)}' > commands  
 

Reply

Marsh Posté le 29-11-2008 à 18:20:05    

C'est comme tu veux, ça revient au même. Par contre tu n'as toujours pas compris que /^[ 0-9]+$/ ne match pas tes lignes...

Reply

Marsh Posté le 29-11-2008 à 21:18:49    

si si g compris...ce que je n'ai pas compris par contre, est l'erreur que ca me retourne quand j'essaie ta proposition...


Message édité par stmasnam le 29-11-2008 à 21:20:09
Reply

Marsh Posté le 29-11-2008 à 23:23:22    

Je t'ai déjà demandé la ligne de commade exacte que tu utilises et l'OS sous lequel tu tournes, mais apparement tu n'as pas vraiment envie qu'on t'aide, donc...

Reply

Sujets relatifs:

Leave a Replay

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