![]() |
|
|
google unix.com
|
|||||||
| Forums | S'inscrire | Forum Rules | Liens | Albums | FAQ | Liste des membres | Calendrier | Recherche | Aujourd'hui, les postes | Marquer les forums comme lus |
| De programmation et de script Shell Posez vos questions à propos de KSH, CSH, SH, BASH, PERL, PHP, SED, awk et d'autres scripts shell et les langages de script shell ici. |
Plus d'UNIX et Linux Forum Sujets Vous trouverez peut-être utile
|
||||
| Fil | Thread Starter | Forum | Réponses | Last Post |
| l'autorisation de changer en utilisant FTP | panknil | De programmation et de script Shell | 3 | 11-07-2007 08:08 PM |
| Changement de nom d'utilisateur et de l'évolution de groupe et GID | deal732 | De programmation et de script Shell | 2 | 04-18-2007 11:09 AM |
| Modification de l'ordre en utilisant sed | venu_nbk | UNIX pour les nuls Questions et réponses | 9 | 07-29-2006 06:03 PM |
| Modification des utilisateurs | Bab00shka | De programmation et de script Shell | 2 | 08-01-2003 05:44 AM |
| Changer IP | Hordak | UNIX pour les nuls Questions et réponses | 2 | 08-03-2002 01:42 AM |
![]() |
|
|
LinkBack | Thread Tools | Recherche sur ce Thread | Rate Thread | Modes d'affichage |
|
|
|
||||
|
Bonjour là, Voici (une partie) du fichier que je souhaite changer. Note les trois espaces avant le "3" (qui peut être "2" ou "0" également). Code:
3 621530 1.1935E-02 631530 1.1293E+01 641530 1.1117E-02 571540 4.4419E-14 3 581540 2.6670E-10 591540 3.8610E-09 601540 1.1016E-06 611540 3.2618E-06 3 611541 6.5572E-07 621540 9.8307E+00 631540 3.1177E+00 641540 1.4615E+00 3 571550 0.0000E+00 581550 8.8139E-12 591550 1.0739E-09 601550 2.5639E-07 3 611550 1.1011E-06 621550 3.6787E-05 631550 3.4821E+00 641550 3.1855E+00 3 641551 0.0000E+00 581560 9.4585E-13 591560 7.5358E-11 601560 1.2023E-07 3 611560 1.7968E-07 621560 5.4237E-04 631560 3.0054E-02 641560 6.5687E+00 3 581570 2.3926E-14 591570 9.9322E-12 601570 4.3929E-09 611570 4.6793E-07 3 621570 5.5911E-06 631570 6.3564E-04 641570 3.2355E+00 591580 2.8608E-13 Je veux trouver un ID (par exemple 621530) et modifiez la valeur suit. J'utilise ce script: Code:
VALUE=".........."
awk -v var="$VALUE" 'BEGIN{}
NR==FNR{a[$0]=$0; next}
{for(i=2;i<9;i+=2)if($i in a){$(i+1)=var}}
#{$1=" "$1}
{print}' ID_to_be_changed my_file
Le problème est qu'il supprime les trois places en face de la ligne si elle change quelque chose dans la ligne ... la suppression de la ligne des commentaires qui résout le problème. Cependant, je ne sais pas comment conserver le même nombre d'espaces entre les lignes: 2 espaces entre le code et la valeur suivante, et 1 espace compris entre une valeur et d'identité, après que (le script ci-dessus transforme tout en un seul espace). Est ce que quelqu'un peut m'aider? |
|
||||
|
Pour l'instant, la seule solution que j'ai est: Code:
VALUE=".........."
awk -v var="$VALUE" 'BEGIN{FS=OFS=" "}
NR==FNR{a[$0]=$0; next}
{for(i=4;i<9;i+=2)if($i in a){$(i+1)=var}}
{for(i=4;i<9;i+=2)if($i in a){print " ",$1,$2," "$3,$4," "$5,$6," "$7,$8," "$9;next}}
{print}' ID_to_be_changed my_file
En effet, pour quelques lignes, certaines valeurs n'ont pas le format "x.xxxxExxx", mais moins de caractères (par exemple, "0.0"). Ensuite, les caractères manquants sont des "espaces" pour garder l'alignement: Code:
2 982520 1.6134E-14 982530 1.7241E-17 982540 3.4164E-20 982550 1.2285E-24 2 992530 1.8708E-17 992541 6.2076E-22 992540 7.5646E-20 992550 7.0917E-22 2 162500 7.6697E-08 0 0.0000E+00 0 0.0000E+00 0 0.0000E+00 3 10030 2.0892E-01 30060 6.0786E-04 30070 1.3046E-05 40090 1.9438E-05 3 40100 1.1748E-04 60140 1.6964E-05 280660 0.0000E+00 290660 1.4066E-14 3 300660 5.0403E-09 290670 7.6644E-19 300670 2.4718E-10 300680 1.1002E-12 Ma solution fonctionne aussi longtemps que je ne suis pas l'évolution des valeurs situées sur les lignes avec "réduit en" caractères ... (tant que rien n'est changé dans la ligne, awk n'est pas re-concaténer la ligne, donc le droit de conserver l'espacement). Aussi, en utilisant tous les arguments d'impression n'est pas facile ... Comment pourrais-je résoudre ces deux problèmes? |
|
||||
|
Vous pouvez utiliser printf pour imprimer la ligne avec un format fixe, quelque chose comme: Code:
VALUE=".........."
awk -v var="$VALUE" 'BEGIN{FS=OFS=" ";fmt="%5s%7s%12s%7s%12s%7s%12s%7s%12s\n"}
NR==FNR{a[$0]=$0; next}
{for(i=4;i<9;i+=2)if($i in a){$(i+1)=var}}
{for(i=4;i<9;i+=2)if($i in a){printf(fmt,$1,$2,$3,$4,$5,$6,$7,$8,$9);next}}
{print}' ID_to_be_changed my_file
Observe |
![]() |
| Bookmarks |
| Thread Tools | Recherche sur ce Thread |
| Modes d'affichage | Rate this thread |
|
|