[Shell-script] problème de vide dans colonnes

Résolu/Fermé
phil - 17 avril 2007 à 09:04
 phil - 17 avril 2007 à 14:49
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.

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.
0
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'.
0
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à.
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
17 avril 2007 à 10:02
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 ?
0

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.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
17 avril 2007 à 10:21
Salut,

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   Pn
tu 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
;-))
0
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 ! :)
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894 > phil
17 avril 2007 à 12:08
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...

;-))
0
phil > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
17 avril 2007 à 13:12
Voilà :
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.
0
phil > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
17 avril 2007 à 13:27
Bon ! après un foultitude d'essais j'ai trouvé. J'utilise 'awk' et 'substr' de la façon suivante :
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.
0
phil > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
17 avril 2007 à 14:49
RESOLU
0