OVH Cloud OVH Cloud

Résultat mystérieux de AWK...

3 réponses
Avatar
Thomas Baruchel
Bonjour,

j'aide par correspondanc eun ami à faire un petit tri avec AWK.
J'utilise le AWK de base de FreeBSD, il utilise GAWK sous Mac OS X,
mais cela dit les commandes sont si simples...

La partie END du programme awk comporte deux boucle 'for' qui ne comportent:
qu'une seule ligne "print"

END {
for ... {
print ... ;
}
for ... {
print ... ;
}
}

A titre de déboguage, nous avons pris la précaution de mettre "###" au début
des print:
print "###" ... ;
Le programme lui-même est encapsulé comme suit:

#!/bin/sh
awk '
...
' data.txt

pas archi élégant, mais au départ c'était censé être un quick'n dirty
bout de code pour résoudre un problème ultra-simple en quelques lignes.

De mon côté, tout se passe bien ; la sortie ne comporte que des lignes
commençat par ###. Normal.

De son côté (gawk sous Mac OS X), il a un truc du genre:

###
###
###
###
avant-avant dernière ligne de data.txt
avant dernière ligne de data.txt
dernière ligne de data.txt
###
###
###
###

Manifestement ce n'est pas le programme AWK lui-même qui imprime
ces lignes ; j'ai pensé qu'elles étaient sur stderr plutôt que stdout,
mais pas le temps de vérifier : il n'a que tcsh et je n'avais pas
en tête dans le bref laps de temps qui lui restait avant de quitter
son bureau le bon moyen pour rediriger stderr vers /dev/null sous tcsh
car apparemment 2>/dev/null ne marche pas sous tcsh.

Cela dit, avez-vous une idée ?
Par ailleurs, aucun message d'erreur de son côté. Pour autant que je puisse
juger, le reste de la sortie prouve que la ligne a correctement été traitée
par le programme (elle n'a pas été oubliée ; les champs ont correctement
été inerprétés, sinon les résultats ne seraient pas tout à fait les mêmes).

???

--
Thomas Baruchel

3 réponses

Avatar
Stephane Chazelas
2005-06-29, 21:10(+00), Thomas Baruchel:
Bonjour,

j'aide par correspondanc eun ami à faire un petit tri avec AWK.
J'utilise le AWK de base de FreeBSD, il utilise GAWK sous Mac OS X,
mais cela dit les commandes sont si simples...
[...]


Sans voir le script, difficile a dire. Yaurait pas des
characters cachés dans le script?

--
Stéphane

Avatar
Thomas Baruchel
Le 29-06-2005, Stephane Chazelas a écrit :
Sans voir le script, difficile a dire. Yaurait pas des
characters cachés dans le script?
Strictement aucun (je viens de remplacer sous VIM les espaces par _ et les fins

de ligne par # et il ne reste rien que des choses bien visibles). En
revanche, je jette un oeil à la base de données...

Pas plus, autant de champs que toutes les autres lignes pour les trois
concernées, ah, ah, ah... A des endroits très différents des trois lignes
concernées, il y a bien des restes d'accents Mac "classique" que nous
n'avions pas converti parce que cela n'était pas gênant. Je précise
cependant
a) que ces "accents" ne sont pas affichés dans la sortie normale du
programme (ces champs ne sont pas pris en compte) ;
b) que de mon côté j'ai les mêmes accents ~N et ~O sans rencontrer
ce problème (mais il est vrai que nous n'utilisons pas le même AWK).
Pour le script, le voici:

#!/bin/sh
awk -F "t" ' BEGIN { sep = "t"; slash = "t"; }
{
variete1 [$3] +=$5; variete2 [$3] +=$6; variete3 [$3] +=$7;
variete4 [$3] +=$8; variete5 [$3] +=$9; variete6 [$3] +=$10;
syst1 [$2] +=$5; syst2 [$2] +=$6; syst3 [$2] +=$7;
syst4 [$2] +=$8; syst5 [$2] +=$9; syst6 [$2] +=$10;
}
END {
for (nom in variete1) {
print nom sep variete1[nom] sep variete2[nom] sep variete3[nom] variete4[nom] sep variete5[nom] sep variete6[nom];
}
print "============";
for (nom in syst1) {
print nom sep syst1[nom] sep syst2[nom] sep syst3[nom] syst4[nom] sep syst5[nom] sep syst6[nom];
}
} ' data.txt

Rien de bien méchant...

--
Thomas Baruchel

Avatar
Thomas Baruchel
Le 29-06-2005, Thomas Baruchel a écrit :
Rien de bien méchant...
Trouvé ; j'avais cette version du script ; mon copain avait ajouté

print; print; print;
dans sa version entre les deux boucles pour sauter un espace...

--
Thomas Baruchel