[Shell-script] problème de vide dans colonnes
Résolu
phil
-
phil -
phil -
Bonjour à tous.
A chaque journée son problème. Bref, j'ai un fichier qui comporte plusieurs colonnes, j'ai fait un script qui permet d'extraire une colonne de ce fichier en utilisant un awk et {print $1}.
Mon problème est le suivant : cette colonne est remplie de chiffres et parfois il n'y a pas de valeur (donc un vide) le print $1 ne tient pas compte de ce vide et va chercher la valeur de la colonne d'à côté.
Ex:
DIST AZIM PHASE
22.5 159 p
56.2 186 S
146 Pn
8.62 175 S
Donc ici si je fais : awk '{print $1}' cela me sort la valeur 146 au lieu de rien (dans la ciquième ligne).
Comment faire pour extraire une colonne en tenant compte de ces vides ?
NB : les colonnes peuvent-être identifier par leur en-tête, celle qui m'interresse est celle appelé DIST par example.
Merçi d'avance.
A chaque journée son problème. Bref, j'ai un fichier qui comporte plusieurs colonnes, j'ai fait un script qui permet d'extraire une colonne de ce fichier en utilisant un awk et {print $1}.
Mon problème est le suivant : cette colonne est remplie de chiffres et parfois il n'y a pas de valeur (donc un vide) le print $1 ne tient pas compte de ce vide et va chercher la valeur de la colonne d'à côté.
Ex:
DIST AZIM PHASE
22.5 159 p
56.2 186 S
146 Pn
8.62 175 S
Donc ici si je fais : awk '{print $1}' cela me sort la valeur 146 au lieu de rien (dans la ciquième ligne).
Comment faire pour extraire une colonne en tenant compte de ces vides ?
NB : les colonnes peuvent-être identifier par leur en-tête, celle qui m'interresse est celle appelé DIST par example.
Merçi d'avance.
A voir également:
- [Shell-script] problème de vide dans colonnes
- Classic shell - Télécharger - Personnalisation
- Comment faire deux colonnes indépendantes dans word - Guide
- Script vidéo youtube - Guide
- Supprimer page word vide - Guide
- Classer par ordre alphabétique excel plusieurs colonnes - Guide
6 réponses
Si ton fichier est pas trop long, peut etre qu'une premiere lecture, avec un `wc` pour compter le nombre de champ par ligne, et dans le cas ou il est de 2, rajouter un caractère en debut pourrait t'aider.
Voir ne recupere le champ que si le nombre de champ (mot en faite) est de 3.
Voir ne recupere le champ que si le nombre de champ (mot en faite) est de 3.
Je viens de m'apercevoir que mon exemple est faux, il faut voir un vide dans la première colonne est cinquième ligne. Donc, pour te répondre je ne pense pas qua cette solution pourrait marcher, les vides sont présents.
Voilà à quoi ressemble l'un des mes fichier (ce n'est qu'une partie)
1 Sta Dist EvAz Phase
2 IMHD 1.53 150.9 Pg
3 IRAZ ... 174.9 Pn
4 IAFJ 1.97 125.9 Pn
5 IPRN 2.22 109.9 Pn
6 DAMV 2.27 127.3 e Pn
7 DAMV ... 127.3 Sg
8 GRMI 2.31 321.0 e Pn
9 IDMV 2.34 127.5 Pn
(la numérotation des lignes n'est pas présente dans le fichier et les pointillés représentent des vides)
En plus, si je veux extraire la colonne 4 avec un {print $4} est bien pour la ligne 6 cela va sortir 'e'.
Voilà à quoi ressemble l'un des mes fichier (ce n'est qu'une partie)
1 Sta Dist EvAz Phase
2 IMHD 1.53 150.9 Pg
3 IRAZ ... 174.9 Pn
4 IAFJ 1.97 125.9 Pn
5 IPRN 2.22 109.9 Pn
6 DAMV 2.27 127.3 e Pn
7 DAMV ... 127.3 Sg
8 GRMI 2.31 321.0 e Pn
9 IDMV 2.34 127.5 Pn
(la numérotation des lignes n'est pas présente dans le fichier et les pointillés représentent des vides)
En plus, si je veux extraire la colonne 4 avec un {print $4} est bien pour la ligne 6 cela va sortir 'e'.
Ahhhhhh flutte ! j'arrive pas à afficher un tableau correctement !
Bon, pour être bref. Ma question est la suivante : peut-on, avec un awk, extraire une colonnes à partir de son en-tête. Par exemple extraire la colonne 'DIST'.
Voilà.
Bon, pour être bref. Ma question est la suivante : peut-on, avec un awk, extraire une colonnes à partir de son en-tête. Par exemple extraire la colonne 'DIST'.
Voilà.
awk possède une variable FS qui définit le séparateur de champ. En définissant FS' ' un seul blanc comme séparateur,
ça pourrait marcher ?
ça pourrait marcher ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
1..Sta........Dist......EvAz.......Phase
2..IMHD....1.53.....150.9.........Pg
3..IRAZ ................174.9.........Pn
4..IAFJ .....1.97 ....125.9.........Pn
5..IPRN ....2.22 ....109.9.........Pn
6..DAMV ...2.27.....127.3...e....Pn
7..DAMV................127.3...e....Sg
8..GRMI.....2.31.....321.0...e....Pn
9..IDMV.....2.34.....127.5.........Pn
Voilà, c'est un peu mieux. Bon, pour le séparateur j'ai déjà essayer est ça ne marche pas. car comme tu peux le voir sur l'exemple, j'ai au début du fichier 4 colonnes (séparées par des espaces) puis parfois une autre colonnes vient se greffer entre deux (cf. la colonne avec les 'e'). Donc le $x ne peut pas marcher est différencier les colonnes par leur séparateur ne marchera pas non plus.
2..IMHD....1.53.....150.9.........Pg
3..IRAZ ................174.9.........Pn
4..IAFJ .....1.97 ....125.9.........Pn
5..IPRN ....2.22 ....109.9.........Pn
6..DAMV ...2.27.....127.3...e....Pn
7..DAMV................127.3...e....Sg
8..GRMI.....2.31.....321.0...e....Pn
9..IDMV.....2.34.....127.5.........Pn
Voilà, c'est un peu mieux. Bon, pour le séparateur j'ai déjà essayer est ça ne marche pas. car comme tu peux le voir sur l'exemple, j'ai au début du fichier 4 colonnes (séparées par des espaces) puis parfois une autre colonnes vient se greffer entre deux (cf. la colonne avec les 'e'). Donc le $x ne peut pas marcher est différencier les colonnes par leur séparateur ne marchera pas non plus.
Salut,
Si ton fichier se présente sous la forme :
Si ton fichier se présente sous la forme :
Sta Dist EvAz Phase IMHD 1.53 150.9 Pg IRAZ 174.9 Pn IAFJ 1.97 125.9 Pn IPRN 2.22 109.9 Pn DAMV 2.27 127.3 e Pn DAMV 127.3 Sg GRMI 2.31 321.0 e Pn IDMV 2.34 127.5 Pntu peux essayer avec cette syntaxe :
awk 'BEGIN {FS="[ \t]+"} {if (NF < 4){print $2} else {print $3}}' plop.txt EvAz 150.9 174.9 125.9 109.9 127.3 127.3 321.0 127.5;-))
J'ai essayer ta méthode et bien que je n'ai pas tout compris à ta ligne de commande je n'est pas l'impression que ce soit ce que je recherche. Je pense que, vu le caractère aléatoire de mes colonnes (cf. voir le tableau au dessus) la solution du {print $x} n'est pas bonne. il faudrait que je puisse identifier la colonne avec le début. la colonne 'DIST' resterait ainsi toujour la colonne 'DIST'.
Voilà, j'espère être assez précis.
Merçi d'essayer de m'aider et si quelqu'un à une autre idée...Bah, je suis preneur ! :)
Voilà, j'espère être assez précis.
Merçi d'essayer de m'aider et si quelqu'un à une autre idée...Bah, je suis preneur ! :)
Re-
Fait un Copier/Coller de ton fichier (quelques lignes) en l'encadrant par les balises "Code" (quand tu rédiges ton messages, les boutons au-dessus "G", "I", "S" "Code" et "Liens"), voir à ce sujet le guide d'utilisation), qu'on voit réellement à quoi ressemble ton fichier...
;-))
Fait un Copier/Coller de ton fichier (quelques lignes) en l'encadrant par les balises "Code" (quand tu rédiges ton messages, les boutons au-dessus "G", "I", "S" "Code" et "Liens"), voir à ce sujet le guide d'utilisation), qu'on voit réellement à quoi ressemble ton fichier...
;-))
Voilà :
whaa..c'est vrai que ça marche mieux avec l'option 'code'.
C'est un des fichier que je traite mais parfois dans la colonne 'Dist' il n'y a pas de valeur d'où mon problème.
D'autre part, mais ça ne me gène finalement pas, la colonne où des 'e' apparaissent n'est jamais noté dans l'en-tête et les 'e' ne sont pas toujours présent.
Pour l'instant je suis entrain de tester mon script avec awk + substr mais je ne le maîtrise pas très bien donc j'y vais un peu à tâton.
SOUTHERN IRAN Sta Dist EvAz Phase Date Time TRes GHIR 0.54 1.1 e Pg 2005/01/01 02:14:55.1 -0.5 GHIR 0.54 1.1 e Sg 2005/01/01 02:15:04.3 1.0 BNDS 2.86 96.2 e Pn 2005/01/01 02:15:31.9 0.1 BNDS 2.86 96.2 e Sg 2005/01/01 02:16:14.5 0.3 KRBR 4.00 55.2 e Pn 2005/01/01 02:15:47.6 0.0 MZLS 7.91 243.8 P 2005/01/01 02:16:42.7 0.4 ARSS 8.90 260.2 P 2005/01/01 02:16:56.2 0.2 HILS 9.93 270.5 P 2005/01/01 02:17:08.8 -1.5 TATS 153 228.8 PKPbc 2005/01/01 02:17:37.1 -0.5
whaa..c'est vrai que ça marche mieux avec l'option 'code'.
C'est un des fichier que je traite mais parfois dans la colonne 'Dist' il n'y a pas de valeur d'où mon problème.
D'autre part, mais ça ne me gène finalement pas, la colonne où des 'e' apparaissent n'est jamais noté dans l'en-tête et les 'e' ne sont pas toujours présent.
Pour l'instant je suis entrain de tester mon script avec awk + substr mais je ne le maîtrise pas très bien donc j'y vais un peu à tâton.
Bon ! après un foultitude d'essais j'ai trouvé. J'utilise 'awk' et 'substr' de la façon suivante :
avec : $0 pour prendre la ligne.
8 : la position du début de la ligne à sélectionner.
5 : le nombre de caractères à prendre.
Du coup même si c'est vide la awk le prend quand même.
awk '{print substr($0,8,5)}' toto > titi
avec : $0 pour prendre la ligne.
8 : la position du début de la ligne à sélectionner.
5 : le nombre de caractères à prendre.
Du coup même si c'est vide la awk le prend quand même.