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 28/11/2011, 20h08   #1
Futur Membre du Club
 
Inscription : septembre 2008
Messages : 37
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 37
Points : 19
Points : 19
Par défaut Afficher un intervalle de champs avec awk

Bonjour,

j'ai ce texte à parser :

Code :
1
2
3
4
d0: Mirror     Submirror 0: d10       State: Okay              Submirror 1: d20       State: Okay              Pass: 1     Read option: roundrobin (default)     Write option: parallel (default)     Size: 4194828 blocks
d10: Submirror of d0     State: Okay              Size: 4194828 blocks     Stripe 0: Device              Start Block  Dbase State        Hot Spare c0t0d0s0                   0     No    Okay
d20: Submirror of d0     State: Okay              Size: 4194828 blocks     Stripe 0: Device              Start Block  Dbase State        Hot Spare c0t1d0s0                   0     No    Okay
etc...

Je passe ça comme commande :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
nawk 'BEGIN {RS=""}
{gsub(/\n/," ",$0)
gsub(/\t/,"", $0)
print $1"|"$2"|"$3"|"$4"|"$5}' meta.txt
 
 
d0:|Mirror|Submirror|0:|d10
d10:|Submirror|of|d0|State:
d20:|Submirror|of|d0|State:
d1:|Mirror|Submirror|0:|d11
d11:|Submirror|of|d1|State:
d21:|Submirror|of|d1|State:
d4:|Mirror|Submirror|0:|d14
d14:|Submirror|of|d4|State:
d24:|Submirror|of|d4|State:
d5:|Mirror|Submirror|0:|d15
d15:|Submirror|of|d5|State:
d25:|Submirror|of|d5|State:
d6:|Mirror|Submirror|0:|d16
d16:|Submirror|of|d6|State:
d26:|Submirror|of|d6|State:
d7:|Mirror|Submirror|0:|d17
d17:|Submirror|of|d7|State:
d27:|Submirror|of|d7|State:
Cela me donne bien ce que je veux, mais le soucis c'est qu'il ya beaucoup de champs ($1,$2,$3,$4,$5,$6 etc..), et que je ne veux pas alourdir la commande en les mettant tous, c'est pourquoi j'aimerais savoir si il existait un moyen (sans doute une boucle) pour afficher tout les champs sans devoir les rentrer dans la commande ?

Merci d'avance.
sedawk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 22h07   #2
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 072
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 072
Points : 4 155
Points : 4 155
Bonjour,

Code :
1
2
3
4
5
6
nawk 'BEGIN{RS=""}
{
   gsub(/\n/," ",$0)
   gsub(/\t/,"", $0)
   for( x=1; x<=NF; x++) if(x < NF){ printf("%s|",$x) }else{ printf("%s\n",$x) }
}'

?
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 28/11/2011, 22h08   #3
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
Localisation : France, Oise (Picardie)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 3 055
Points : 4 934
Points : 4 934
Citation:
Envoyé par sedawk Voir le message
...mais le soucis c'est qu'il ya beaucoup de champs ($1,$2,$3,$4,$5,$6 etc..), et que je ne veux pas alourdir la commande en les mettant tous, c'est pourquoi j'aimerais savoir si il existait un moyen (sans doute une boucle) pour afficher tout les champs sans devoir les rentrer dans la commande ?
Salut

Code bash :
nawk 'BEGIN {RS=""} {gsub(/\n/," ",$0); gsub(/\t/,"", $0); for (i=1; i <= NF; i++) printf("%s%s", $i, i < NF ?"|" :"\n" )}' meta.txt
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 29/11/2011, 10h06   #4
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

Code :
sed ':z;N;$!bz;s/ \|\n/|/g;s/\t/|/g;s/||*/|/g' fichier


Oups, rectification

Code :
sed ':z;N;$!bz;s/\s\+\|\n/|/g' fichier
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 29/11/2011, 10h39   #5
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Sinon :

Code :
tr -d '\n' < fichier | tr -s ' ' '|'
Le fait aussi

Édit : Décidément ce n'est pas mon jour

Code :
tr -s '[ \n]' '||' < fichier
Est encore plus simple
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/11/2011, 20h14   #6
Futur Membre du Club
 
Inscription : septembre 2008
Messages : 37
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 37
Points : 19
Points : 19
Bonsoir,

merci à tous pour vos réponses, c'est sympas de voir les différentes façons de faire

Les solution de N_BaH et sve@r m'ont paru moins complexe à comprendre que le sed ce qui n'enlève pas le mérite de cette commande aussi utile que awk

A priori c'est tout à fait ce que je voulais, juste une petite question à sve@r, tu peux m'expliquer cette partie du code avec le point d'interrogation ? merci

Code :
printf("%s%s", $i, i < NF ?"|" :"\n" )}
sedawk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 01h28   #7
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
Localisation : France, Oise (Picardie)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 3 055
Points : 4 934
Points : 4 934
Citation:
Envoyé par sedawk Voir le message
A priori c'est tout à fait ce que je voulais, juste une petite question à sve@r, tu peux m'expliquer cette partie du code avec le point d'interrogation ? merci

Code :
printf("%s%s", $i, i < NF ?"|" :"\n" )}
Il s'agit d'une écriture empruntée au langage C (théoriquement awk devrait accepter).

La syntaxe générale est condition ?valeur_si_vrai :valeur_si_fauxIl s'agit d'un opérateur donc d'une instruction complète qui vaut la valeur 1 si la condition est vérifiée et sinon la valeur 2.

Donc ici, "%s" reçoit et affiche
=> "|" si i < NF donc si on est en milieu de ligne
=> "\n" si i == NF donc si on est sur le dernier mot de la ligne
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 07h49   #8
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

Explications concernant la commande "sed" :

Citation:
:z
On pose une étiquette (2 points suivis du nom que tu veux) afin de boucler sur celle-ci en fonction d'une condition (voir plus loin)


N
On ajoute la ligne suivante dans la mémoire principale


$! bz
La condition et le comportement à adopter en fonction.
Donc, si ce n'est pas la dernière ligne ("$" caractérisant la dernière ligne et "!" la négation) qui est chargée dans la mémoire principale, on se branche (b) à l'étiquette ":z"


s/\s\+\|\n/|/g
On subsitue n'importe quel caractère d'espacement (le "\s" signifiant espace, tabulation horizontale ou verticale) présent une ou plusieurs fois (\+), ou (\|) un caractère de saut de ligne (\n) par une barre verticale (|) et ceci autant de fois que nécessaire (g)
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/11/2011, 08h08   #9
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
Localisation : France, Oise (Picardie)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 3 055
Points : 4 934
Points : 4 934
Citation:
Envoyé par zipe31 Voir le message
Salut,

Explications concernant la commande "sed" :


Impressionnant
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 10h19   #10
Futur Membre du Club
 
Inscription : septembre 2008
Messages : 37
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 37
Points : 19
Points : 19
Merci à vous trois !

Pour le sed, j'avoue faut maitriser mais chapeau bas, pour awk, je ne cesse d'apprendre de nouvelles choses chaque jour

J'ai trouver comment passer en résolu
sedawk est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h15.


 
 
 
 
Partenaires

Hébergement Web