Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/01/2011, 17h44   #1
Membre du Club
 
Inscription : août 2009
Messages : 65
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 65
Points : 44
Points : 44
Par défaut Afficher un intervalle entre 2 motifs

Bonjour,

J'ai utilisé l'expression
Code :
sed -n /^D/,/^F/'p' fic_in > fic_out
pour extraire les enregistrements compris entre la ligne qui débute par D et celle qui débute par F.

Si j'ai le cas d'un fichier "fic_in"
Code :
1
2
3
4
5
6
7
8
9
10
11
 
DLIGNE01.....
LIGNE02.......
LIGNE03.......
LIGNE05..........
FLIGNE06.......
DLIGNE07.....
LIGNE08.......
LIGNE09.......
LIGNE10..........
FLIGNE11.......
Le problème est que le résultat obtenu avec le code
Code :
sed -n /^D/,/^F/'p' fic_in > fic_out
équivaut au contenu du fichier "fic_in". Autrement dit, le fic_out est identique à fic_in (rien de surprenant compte tenu du code).

Ce que je cherche à faire, c'est avoir deux fichiers pour le coup :

fic1
Code :
1
2
3
4
5
6
 
DLIGNE01.....
LIGNE02.......
LIGNE03.......
LIGNE05..........
FLIGNE06.......
fic2
Code :
1
2
3
4
5
6
 
DLIGNE07.....
LIGNE08.......
LIGNE09.......
LIGNE10..........
FLIGNE11.......
Cette manière de faire va me permettre ensuite de rejeter les fichiers qui ne respectent pas la règle : entête doit toujours commencée par D et la fin du fichier par F. Ce qui peut correspondre au code suivant :

Code :
1
2
3
4
5
6
7
8
9
 
D=`head -1 fic1 | cut -c 1-1`
F=`tail -1 fic1 | cut -c 1-1`
if [[ ${D} == "D" ]] && [[ ${F} == "F" ]] 
  then 
       "Fic à garder"
  else
        "Fic à rejeter"
fi
Avez-vous une idée ?
Merci infiniment pour votre aide.
emmachane est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/01/2011, 18h39   #2
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 068
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 068
Points : 4 140
Points : 4 140
Bonjour,

Je ne suis pas certain d'avoir tout compris :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
 
while read line
do if [[ $line == D* ]]
   then <s>((flag)) && unset text</s>  #ça ne sert à rien : text="$line" écrase $text
        flag=1
        text="$line"
   elif ((flag))
   then text+=$'\n'"$line"
        if [[ $line == F* ]]
        then unset flag
             echo "$text" >fic$((++n))
        fi
   fi
done <fichier.in
...
?
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 14/01/2011, 00h03   #3
Membre du Club
 
Inscription : août 2009
Messages : 65
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 65
Points : 44
Points : 44
Merci
emmachane est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h07.


 
 
 
 
Partenaires

Hébergement Web