Flux rss
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Non résolu

[scripts unix] - gestion fichiers

david_m, le mercredi 14 décembre 2005 à 18:37:58
Bonjour,

Voilà mon soucis: je ne suis pas bon en scripts Unix! (shell, perl, awk, sed ..)
En fait, je souhaite transformer un fichier de la forme:

textepeuimportelecontenu1
VALEUR
{
valx
}
textepeuimportelecontenu2
VALEUR
{
valy
}
textepeuimportelecontenu2

--> donc c'est un fichier "relativement" construit. j'ai un deuxième fichier qui liste un ensemble de valeurs:
...
val1.1
val x.x
...

--> je souhaite parcourir le fichier 1, puis dans chaque bloc de type :
VALEUR
{
...
}

, vérifier que la valeur entre les 2 {} est bien dans le fichier 2

Si c'est le cas, conserver le bloc dans le fichier 1
Sinon, supprimer le bloc dans le fichier 1.

Voilà j'ai beaucoup détaillé, je sais que en awk, on peut faire beaucoup de choses, mais là je ne suis pas sûr que cela suffise.

J'ai peur de me lancer dans du dév. pour revenir régulièrement en arrière, je sollicite donc votre aide. Si vous avez des pistes, même un début j'accepte.

d'avance merci

david m.
Répondre à david_m  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
mamiemando, le jeudi 15 décembre 2005 à 01:33:33
Moi je ferais un petit script en python ou en perl, en utilisant des expressions régulières. Je te suggère de regarder un petit tutorial sur google pour voir comment tout ça marche.

Bonne chance
Répondre à mamiemando

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
lami20j, le jeudi 15 décembre 2005 à 04:56:43
Salut,

Voilà un petit exemple.
Le fichier 1 je ne le modifie pas, je l'utilise seulement pour lire les données, ensuite je compare avec les données du fichier 2. Le résultat est écrit dans le fichier 3.

Je n'ai pas testé tous le possibilité (texte n'importe quel contenu c'est un peu vaste). C'est vrai que les expressions régulières sont puissantes, mais il faut savoir la structure de texte à traiter.
Le script et un example
#! /usr/bin/perl -w
use strict;

$/="\n\n\n"; # à cause des sautes de ligne que j'ai ajouté avant VALEUR
# s'il n'y a pas de saute de ligne avant VALEUR $/="" suffit

my @vec;
my @valeur;

open FVALEUR,"/home/lamitest/david_m1.txt" ;
my $ligne=<FVALEUR>;
$ligne =~ s/valeur\n/:valeur/ig;
$ligne =~ s/{\n/{/g;
$ligne =~ s/\n}/}:/g;
my @ligne= split /:/, $ligne;
close FVALEUR;

open FCOMPARE,"/home/lamitest/david_m2.txt"
        or die "Impossible d'ouvrir le fichier : $!\n";

while (my $val = <FCOMPARE>){
        chomp($val);
        push @valeur,$val;
}
close FCOMPARE;

foreach my $x(@ligne){
        if ($x!~/valeur{(\d+)}/i){
                push (@vec,$x);
        }elsif ($x=~/(valeur{(\d+)})/i){
                push @vec,"\U$1" if (grep /$2/,@valeur);
        }

}

open FECRIRE,"> /home/lamitest/david_m_res.txt"
        or die "Impossible de créer le fichier : $!";

foreach(@vec){
        s/valeur/\Uvaleur\n/i;
        s/{/{\n/;
        s/}/\n}/;
        print FECRIRE;
}
close FECRIRE;

Fichier 1. Données lues
[lamitest@localhost ~]$ cat david_m1.txt
Le ficier N°1 ou se trouve des données et du texte
Dans le fichier n°2 les chiffre : 250 et 22
textepeuimportelecontenu1
ligne 1
Ce bloc doit rester

VALEUR
{
250
}
ligne2
textepeuimportelecontenu2

VALEUR
{
137
}
bla bbla
textepeuimportelecontenu2
textepeuimportelecontenu1
Ce bloc doit rester
VALEUR
{
22
}
textepeuimportelecontenu2
texte à ajouter
VALEUR
{
10257
}
textepeuimportelecontenu2

[lamitest@localhost ~]$

Fichir 2 - valeurs à comparer
[lamitest@localhost ~]$ cat david_m2.txt
22
250
30
[lamitest@localhost ~]$

Fichier 3 - les blocs dont les valeurs correspondent sont écrits
[lamitest@localhost ~]$ cat david_m_res.txt
Le ficier N°1 ou se trouve des données et du texte
Dans le fichier n°2 les chiffre  250 et 22
textepeuimportelecontenu1
ligne 1
Ce bloc doit rester

VALEUR
{
250
}
ligne2
textepeuimportelecontenu2


bla bbla
textepeuimportelecontenu2
textepeuimportelecontenu1
Ce bloc doit rester
VALEUR
{
22
}
textepeuimportelecontenu2
texte à ajouter

textepeuimportelecontenu2

[lamitest@localhost ~]$
Répondre à lami20j

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
david_m, le jeudi 15 décembre 2005 à 10:53:44
d'abord merci pour ton aide.
Quand je dis textenimportequelcontenu, c'est vraiment que cela peut-être n'importe quoi. En lisant (décryptant...) le script, il me semble que j'ai omis de dire une chose:
Dans textenimportequelcontenu, il peut y avoir
VALEUR2
{
valx
}

Si j'ai bien compris le script, les traitements se font par rapport aux accolades, dans mon cas ce serait plûtôt par rapport à VALEUR.

En tout cas je continue ...
Répondre à david_m

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
lami20j, le jeudi 15 décembre 2005 à 19:12:20
Salut,

Si j'ai bien compris le script, les traitements se font par rapport aux accolades, dans mon cas ce serait plûtôt par rapport à VALEUR.

Pas tout à fait. Le traitement et fait par rapport au

VALEUR
{
val
}

Un VALEUR2 ne me dérange pas du tout. Mais en ce cas si tu fait une copie coller d'une partie de ton fichier pour voir la structure, je n'aurai qu'à faire quelques petites modifications.

Je vais insérer aussi des commentaires pour comprendre exactement comme il fonctionne.

Par exemple:
open FVALEUR,"/home/lamitest/david_m1.txt" ;
my $ligne=<FVALEUR>;
$ligne =~ s/valeur\n/:valeur/ig;
$ligne =~ s/{\n/{/g;
$ligne =~ s/\n}/}:/g;
my @ligne= split /:/, $ligne;
close FVALEUR;

$ligne avale le fichier entier.

Ensuite je remplace VALEUR\n avec :VALEUR pour pouvoir faire split par rapport aux :

Si tu as VALEURn (n un numéro quelconque) on peut faire ça
$ligne =~ s/valeur(d*)?\n/:valeur$1/ig;


En ce cas ? reconnaît ou pas une chiffre ou plusieurs.
? quantificateur optionnel
* rien ou une chiffre,2chiffre,...........
En ce cas est reconnu VALEUR, VALEUR2, VALEUR222,.....

C'est bien de savoir si tu as toujours

VALEURn
{
val
}

Voilà la modification
===============================================
$/="";

my @vec;
my @valeur;

open FVALEUR,"/home/lamitest/david_m1.txt" ;
my $ligne=<FVALEUR>;
$ligne =~ s/valeur(\d*)?\n/:valeur$1/ig;# reconnaît VALEUR,VALEUR1,VALEUR22,..
$ligne =~ s/{\n/{/g;
$ligne =~ s/\n}/}:/g;
my @ligne= split /:/, $ligne;
close FVALEUR;

open FCOMPARE,"/home/lamitest/david_m2.txt"
        or die "Impossible d'ouvrir le fichier : $!\n";

while (my $val = <FCOMPARE>){
        chomp($val);
        push @valeur,$val;
}
close FCOMPARE;

foreach my $x(@ligne){
        if ($x!~/valeur(\d*)?{(\d+)}/i){
                push (@vec,$x);
        }elsif ($x=~/(valeur(?:\d*)?{(\d+)})/i){
                push @vec,"\U$1" if (grep /$2/,@valeur);
        }

}

open FECRIRE,"> /home/lamitest/david_m_res.txt"
        or die "Impossible de créer le fichier : $!";

foreach(@vec){
        s/valeur(\d*)?/\Uvaleur$1\n/i;
        s/{/{\n/;
        s/}/\n}/;
        print FECRIRE;
}
close FECRIRE;

Répondre à lami20j

5


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 lami20j, le jeudi 15 décembre 2005 à 19:22:08
Exemple:

Fichier1
[lamitest@localhost ~]$ cat david_m1.txt
Le ficier N°1 ou se trouve des données et du texte
Dans le fichier n°2 les chiffre : 250 et 22
textepeuimportelecontenu1
ligne 1
Ce bloc doit rester
VALEUR
{
250
}
ligne2
textepeuimportelecontenu2
VALEUR
{
137
}
bla bbla
textepeuimportelecontenu2
textepeuimportelecontenu1
Ce bloc doit rester
VALEUR2
{
22
}
textepeuimportelecontenu2
texte à ajouter
VALEUR
{
10257
}
textepeuimportelecontenu2

[lamitest@localhost ~]$

Fichier 2
[lamitest@localhost ~]$ cat david_m2.txt
22
250
30
[lamitest@localhost ~]$

Résultat
[lamitest@localhost ~]$ cat david_m_res.txt
Le ficier N°1 ou se trouve des données et du texte
Dans le fichier n°2 les chiffre  250 et 22
textepeuimportelecontenu1
ligne 1
Ce bloc doit rester
VALEUR
{
250
}
ligne2
textepeuimportelecontenu2

bla bbla
textepeuimportelecontenu2
textepeuimportelecontenu1
Ce bloc doit rester
VALEUR2
{
22
}
textepeuimportelecontenu2
texte à ajouter

textepeuimportelecontenu2

[lamitest@localhost ~]$
Répondre à lami20j
Script pour afficher fichiers d1 répertoire (Résolu)Bonjour a toutes et tous, Je réalise un script unix dans le cadre de mon travail, et je voudrais afficher à l'écran la liste des fichiers contenus dans un répertoire ( qui n'est pas le répertoire dans lequel je travaille ). Cette commande de... www.commentcamarche.net/forum/affich-4136806-script-pour-afficher-fichiers-d1-repertoire
Script shell exclure fichier (Résolu)bonjour j'ai un script qui étrangement ne fonctionne pas #!/bin/sh prefix="OGL_" for file in [^$prefix]* do echo $file done ce script devrait me traiter uniquement les fichier avec un nom ne commençant pas par "OGL_", malheureusement ces fichier... www.commentcamarche.net/forum/affich-3585859-script-shell-exclure-fichier
[IE7] Problème avec les animations FlashVoici une astuce qui vous aidera si dans Internet Explorer 7, une animation flash est remplacée par un cadre gris sur lequel il faut cliquer pour lancer l'animation. Il suffit d'utiliser un simple script. Créez un fichier .js (JavaScript), et... www.commentcamarche.net/faq/sujet-9918-ie7-probleme-avec-les-animations-flash
[Multimédia] Gestion multimédiaLogiciels de gestion multimédia Par gestion multimédia, comprenons : l'affichage des images sous formes de vignettes, la gestion d'albums de photos, la lecture de fichiers audio, la visualisation de vidéos, éventuellement des possibilités... www.commentcamarche.net/faq/sujet-2193-multimedia-gestion-multimedia
Qu'est-ce qu'un fichier batch ?POURQUOI FAIRE ? COMMENT FAIRE ? Préalables Création du fichier POURQUOI FAIRE ? Windows est fourni avec une version du DOS, ce qui permet d'exploiter les fonctionnalités et l'enchaînement de commandes définies dans un script. Un fichier... www.commentcamarche.net/faq/sujet-5967-qu-est-ce-qu-un-fichier-batch
Scrutation repertoire unix (Résolu)Bonjour, Tout d'abord, mes connaissance Unix sont proche de la nullité. ^_^ Je souhaite réaliser un script UNIX (environnement AIX) qui va realiser deux choses : 1) des la presence d'un fichier dans un répertoire déterminé (et unique), le... www.commentcamarche.net/forum/affich-6431186-scrutation-repertoire-unix
Lister ts fichiers sans qlqs repertoires (Résolu)Bonjour, J'ai crée un script unix en .sh Je voudrais lister tous les fichiers qui sont dans une arborescence en excluant certains fichiers et répertoires à la fois. par, exple: /tutu -> tutu1.txt; tutu2.txt /tutu/toto -> toto1.txt ; toto2.txt... www.commentcamarche.net/forum/affich-4658063-lister-ts-fichiers-sans-qlqs-repertoires
Shell | lister le contenu d'un repertoire !! (Résolu)Salut ! Je voudrai executer un script uniquement si un fichier (quelquonc et quelque soi l'extension) existe dans un repertoire !!! En gros Si un fichier existe dans /home/ftp/upload/ alors > continuer le script sinon arreter le script !! Fin... www.commentcamarche.net/forum/affich-3216499-shell-lister-le-contenu-d-un-repertoire
Système UNIX - Commandes Commande Unix Description Options ls liste le contenu d'un répertoire -a Affiche tous les fichiers, y compris les fichiers cachés -l Affiche un listing détaillé -R Affiche les fichiers récursivement (c'est-à-dire dans les sous-répertoires) -d Affiche... www.commentcamarche.net/unix/unixcomm.php3
Linux - Gestion des utilisateurs Lorsque diverses personnes ont accès à un système, il est nécessaire que l'administrateur système gère les utilisateurs. Pour ceci, les commandes usuelles et les fichiers à configurer doivent être connus. Les fichiers importants à connaître sont : le... www.commentcamarche.net/unix/unix-users.php3
Apache - Introduction Un serveur web est un logiciel permettant à des clients d'accéder à des pages web, c'est-à-dire en réalité des fichiers au format HTML à partir d'un navigateur (aussi appelé browser) installé sur leur ordinateur distant. Un serveur web est donc un «... www.commentcamarche.net/apache/apacintro.php3
Toutes les réponses pour « [scripts unix] gestion fichiers »