2017-10-06 15 views
2

La première semaine d'octobre, Arnold Robbins a annoncé la version bêta de gawk 4.2.0 maintenant disponible dans les listes de diffusion GNU-announce, bug-gawk et comp.lang.awk. Il est disponible en http://www.skeeve.com/gawk/gawk-4.1.65.tar.gz et il mentionne que Ceci est une version majeure, avec de nombreuses nouvelles fonctionnalités significatives.Quel est le comportement de FS = "" dans GNU Awk 4.2?

Je suis passé par le fichier NOUVELLES à creuser dans ces fonctions et arrêté à ce stade de faire des tests:

Les changements de 4.2.0 à 4.1.4

...

  1. Les révisions de la norme POSIX suppriment le cas particulier du mode POSIX lorsque FS = "" où newline n'était pas un séparateur de champs. Le code et le document ont été mis à jour.

Si je comprends bien, il parle de GNU Awk User's Guide → 4.5.2 Using Regular Expressions to Separate Fields:

Il y a une différence importante entre les deux cas de « FS =" "" (un seul espace) et FS =" [\ t \ n] + "'(une expression régulière correspondant à un ou plusieurs espaces, tabulations ou retours à la ligne). Pour les deux valeurs de FS, les champs sont séparés par des exécutions (plusieurs occurrences adjacentes) d'espaces, de tabulations et/ou de retours à la ligne. Cependant, lorsque la valeur de FS est "", awk supprime d'abord les espaces de début et de fin de l'enregistrement, puis décide où les champs sont.

C'est-à-dire la différence entre l'utilisation de FS = " " et FS = "[ \t\n]+".

j'ai couru la nouvelle version et ai effectué un test avec le mode --posix:

$ ./gawk --posix -F" " '{print "NR:", NR; for(i=1;i<=NF;i++) print i, $i}' <<< "hello how are 
you" 
NR: 1 
1 hello 
2 how 
3 are 
NR: 2 
1 you 

Et par rapport à mon précédent awk (4.1.3) et ne pouvait voir aucune différence:

$ gawk --posix -F" " '{print "NR:", NR; for(i=1;i<=NF;i++) print i, $i}' <<< "hello how are 
you" 
NR: 1 
1 hello 
2 how 
3 are 
NR: 2 
1 you 

Dans l'ensemble, ma question est: quelle est la différence dans le comportement de FS = " " dans le mode --posix pour GNU Awk 4.2? Qu'est-ce qui a été changé exactement?

1 oui, je pense aussi qu'il devrait être 4.2.tar.gz, mais http://www.skeeve.com/gawk/gawk-4.2.tar.gz n'existe pas

+0

c'est curieux ... annoncé mais non réalisé? – RomanPerekhrest

Répondre

2

Il est une version bêta pour 4.2 il est construit/nom de 4.1. Quand c'est officiel ALORS ça sera 4.2.tar.gz.

Je n'ai pas la 4.2 beta pratique pour tester la théorie suivante, mais voici ce que je pense que l'annonce par rapport à la valeur par défaut FS=" " signifie:

Précédemment dans Posix lorsque vous définissez FS=" " que signifiaient les champs ont été séparés par tous les caractères espace blanc sauf nouvelle ligne. D'autre part, gawk incluait newline comme l'un des séparateurs par défaut et vous deviez ajouter --posix pour obtenir le comportement POSIX.Regardez:

$ gawk --version 
GNU Awk 4.1.4, API: 1.1 (GNU MPFR 3.1.5, GNU MP 6.1.2) 

$ printf 'a b\nc' | awk -v RS='^$' 'NR==1{for (i=1; i<=NF;i++) print NR, NF, i, "<" $i ">"}' 
1 3 1 <a> 
1 3 2 <b> 
1 3 3 <c> 

$ printf 'a b\nc' | awk --posix -v RS='^$' 'NR==1{for (i=1; i<=NF;i++) print NR, NF, i, "<" $i ">"}' 
1 2 1 <a> 
1 2 2 <b 
c> 

Apparemment maintenant la norme POSIX a été mis à jour pour inclure \n dans l'ensemble des caractères de séparation lorsque FS=" " si gawk n'a plus besoin de se comporter différemment à cet égard dans posix vs mode non-posix et place tous Posix awks doivent être mis à jour pour se comporter comme gawk a fait par défaut tout le long.

L'exemple de votre question ne le teste pas car il utilise \n comme RS (valeur par défaut) et ne peut donc pas tester ce qui se passe lorsque \n se trouve dans un enregistrement. Essayez à nouveau après avoir défini RS="^$".

+0

C'est génial! J'ai fait mes premiers tests avec quelques 'RS' mais finalement je pensais que ça n'avait pas à être impliqué. – fedorqui

+1

Mais encore une fois, merci de faire la lumière dans ce !! – fedorqui

+0

De rien. Avez-vous testé la théorie dans ma réponse et c'est ce que l'on entend par la note de publication? –