0
votes

Le comportement de Awk est différent dans mon système local et redhat 6.5

rhel 6.5 a la version gnu awk comme ci-dessous xxx

et sous Windows 10, je le vois comme - xxx

programme AWK utilise awk Variables intégrées argv et Argind . Est-ce quelque chose à avec les paramètres régionaux de système dans Rhel?

base.csv : xxx

fichier1 >:: xxx

fichier2 : xxx

fusion.awk :: xxx

exécuté de Linux résulte d'une commande incorrecte des valeurs dans le fichier 1 et 2 xxx

mais de windows Cela fonctionne parfaitement bien et la façon dont je le veux. xxx

Tout indices sera apprécié.

awk

6 commentaires

Veuillez consulter Aide d'édition


L'itération des clés d'un tableau arrive dans l'ordre arbitraire. Mais voir gnu.org/software/gawk/manual/html_node/ ...


Oui, je comprends que l'AWK utilise une matrice associative et une itération avec des indices ne sont pas similaires à d'autres langues, mais voulaient comprendre pourquoi le comportement est différent dans 2 systèmes différents. La logique principale reste la même.


Les deux versions de GAWK utilisent différentes fonctions de hachage ou quelque chose selon ces lignes, donnant différents ordres d'itération.


Dit à juste titre, mais à la recherche d'une solution ou de travailler pour que cela soit fixé. Si nous apprenons à savoir comment le processus informatique et quelles fonctions sont impliquées en interne, nous pouvons changer le comportement peut être.


Le #! / Bin / bash in fusion.awk est juste un commentaire dans le script AWK, ce n'est pas un shebang spécifiant une coquille si c'est ce que vous aviez à l'esprit. Vous faites certainement pas Vous voulez essayer d'apprendre ce que GAWK fonctionne en interne et en quelque sorte à utiliser cela pour affecter le comportement, car votre script va probablement casser pour la prochaine version qui fait quelque chose de différent à l'intérieur.


3 Réponses :


0
votes

AWK code> Les tableaux sont des tables de hachage et l'itération sur leurs éléments à l'aide de pour (x dans y) code> se produisent dans l'ordre arbitraire. GNU AWK a un moyen de spécifier quel ordre est utilisé, cependant, avec le procinfo [" SORTED_IN "] CODE> Réglage (Toutefois, cela ne fonctionne que avec GNU AWK 4.0 et plus récent; 3.x ne le prend pas en charge).

à itérer en ascendant Commande numérique: P>

...
basenum = split($0, base, ",")
...
for (i = 1; i <= basenum; i++) {
   if(base[i] in line)
      printf(",%s", line[base[i]])
    else
      printf(",0")
}


4 commentaires

Shawn je ne pense pas que cela soit lié à l'ordre. Comme je vois toujours que le résultat est identique lorsque nous utilisons ProCinfo pour un ordre trié.


@Rish ah-ha. Trié_in a été ajouté à GAWK 4.0. Votre ancienne version de Gawk sur la machine RedHat est trop dépassée. Essayez la deuxième approche dans ma réponse.


IWAS utilisant des commentaires au lieu de l'onglet Réponse. Avec PROFCINFO, je n'ai pas reçu le résultat attendu.


Oui, j'ai même pensé à améliorer le RPM mais à moi surprises, je vois le paquet officiel RHEL6.5 utilise 3.7.1 qui est un peu surprenant. Je cherche à mettre à jour le RPM et à vérifier les résultats.



0
votes

@shawn j'ai essayé d'utiliser le tableau de style C normal pour l'ancien format de style GNU-AWK. xxx

mais les résultats ne sont pas attendus.

awk -f try.awk bey.csv fichier * Dossier, Steve, Tignor, Ash, Michael, Jose, Sam, Joshua Fichier1,0,0,0 Fichier2,0,0


0 commentaires

0
votes

Voici comment écrire votre code robustablement et de manière à travailler en utilisant n'importe quel awk dans n'importe quel environnement:

$ awk -f merge.awk base.csv file1 file2
file,steve,tignor,ash,michael,jose,sam,joshua
file1,0,888,0,9,-2,0,0
file2,0,0,77,0,0,0,66


3 commentaires

Merci, oui, il fonctionne dans l'environnement Awk Awk.Grat!


HI ed..Can Cette solution est étendue si nous changeons la ligne en colonnes? Veuillez jeter un coup d'œil à la section des questions pour référence. Remerciement à adv.


Questions de Chameleon sont fortement découragées, posez cette question à la manière dont il était, puis poser une nouvelle question.