[ C shell] récupération/remplacement

Fermé
xavdoug Messages postés 21 Date d'inscription samedi 21 avril 2007 Statut Membre Dernière intervention 16 novembre 2007 - 16 nov. 2007 à 05:55
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 16 nov. 2007 à 16:02
Bonjour à tous,

J'ai un soucis : j'ai deux fichiers, fichier1 et fichier2. Dans le fichier1, j'ai une liste de nombres et j'aimerais récupérer le premier nombre de la première ligne et le premier nombre de la dernière ligne (tous deux à cinq chiffres).
Donc, dans l'exemple de fichier1 ci-dessous, je souhaiterais récupérer 34092 et 99281 :

34092 75282 30002 38990 12093 (ligne1)
23902 45291 38493 29382 28371
...
99281 21029 29302 10928 28737 (dernière ligne)

Puis, dans le fichier2, je souhaiterais remplacer un nombre du fichier2 situé à un endroit précis (par exemple, ligne 19 en deuxième position) par le premier nombre récupéré du fichier1.
De même, par exemple, ligne 20, troisième position, je souhaiterais remplacer le nombre situé dans le fichier2 par le deuxième nombre récupéré du fichier1.
Ce qui revient, dans l'exemple ci-dessous de fichier2, à remplacer 45628 par 34092 et 29817 par 99281 :

39202 20891 97363 27682 19736
19827 29730 29737 10283 46583
...
39827 45628 39822 39837 29837 (ligne 19)
10928 23083 29817 39872 10290 (ligne 20)
...

Comment puis-je m'y prendre simplement ?

J'espère que j'ai été assez clair dans mes explications, sinon dites-le-moi.

Merci d'avance pour vos réponses et commentaires.
A voir également:

3 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
16 nov. 2007 à 09:35
Salut,

Tu peux faire ça avec "awk" et "sed" :
% cat fichier1
34092 75282 30002 38990 12093
23902 45291 38493 29382 28371
...
99281 21029 29302 10928 28737

% cat fichier2
39202 20891 97363 27682 19736
19827 29730 29737 10283 46583
ligne3
ligne4
ligne5
39827 45628 39822 39837 29837
10928 23083 29817 39872 10290
ligne8
ligne9
ligne10

# Définition des variables

% set val1=`awk ' NR==1 { print $1 }' fichier1`
% set val2=`awk 'END { NR==FNR ; print $1 }' fichier1`
% set val3=`awk ' NR==6 { print $2 }' fichier2`
% set val4=`awk ' NR==7 { print $3 }' fichier2`

# La commande de substitution. 
#+ Pour une substitution effective, rajouter l'option "-i.BAK" à sed

% sed -e "s/$val3/$val1/;s/$val4/$val2/" fichier2
39202 20891 97363 27682 19736
19827 29730 29737 10283 46583
ligne3
ligne4
ligne5
39827 34092 39822 39837 29837
10928 23083 99281 39872 10290
ligne8
ligne9
ligne10
%
;-))
0
xavdoug Messages postés 21 Date d'inscription samedi 21 avril 2007 Statut Membre Dernière intervention 16 novembre 2007
16 nov. 2007 à 15:32
Merci pour ta solution.
Pour la récupération des variables, ça marche super bien.
Il y a cependant un soucis quand je substitue : si le chiffre d'origine du fichier2 se trouve à plusieurs endroits et que je veux le substituer à un seul endroit, comment adapter ton code ? (car, si j'ai bien compris, il va subtituer à chaque occurrence du nombre dans le fichier2)

En fait, au lieu de substituer telle ligne et tel endroit du fichier2, j'aimerais lui dire de substituer à la seule ligne du fichier où se trouve le mot "start".
Vu que le format de la ligne à substituer est le suivant :

<START:74640>

où 74640 est le chiffre à substituer par le premier chiffre récupéré du fichier1, il suffirait de faire :

echo "<START:"$var1">" > fichier2.txt

ou quelque chose dans ce genre-là.
Reste à savoir comment on fait pour obtenir seulement le numéro de la ligne (avec grep -n on obtient un seul bloc que je n'arrive pas à dissocier, et donc je n'arrive pas à avoir le seul numéro de ligne), et comment on fait pour substituer la ligne (la seule et l'unique) où se trouve le mot START par le output d'une commande echo ...

En bref, pour résumer, la difficulté provient du fait que la ligne que je veux remplacer n'est pas un string constant et d'utiliser un 'sed -i.bak -e' pourrait provoquer des erreurs en remplaçant le chiffre à d'autres endroits du fichier.

Encore merci de ton aide ...
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
16 nov. 2007 à 16:02
A partir du moment où on a un indicatif concernant la ligne où doit être effectué le changement, il suffit à ce moment là de le spécifier dans la commande "sed" :
sed -e "/START/ s/$val3/$val1/" fichier2
et si il y a plusieurs occurrences de la valeur sur la même ligne, il suffit aussi de lui dire laquelle doit être remplacée (par exemple ici la 1ère) :
sed -e "/START/ s/$val3/$val1/1" fichier2
;-))
0