-
FS multiple dans awk
Bonjour
avec awk, je dois lire un fichier dont les séparateurs d'entrée (FS) sont soit des espaces, soit des virgules. J'ai donc défini dans mon code :
Code:
BEGIN{ FS = "[ ,]+" }
Hélas, comme j'ai aussi des espaces avant le premier champ, quand je tente de lire $1, il me renvoie un résultat nul, le premier champ apparaissant en $2. En effet, "If `FS' is any other single character, such as `","', then each occurrence of that character separates two fields. Two consecutive occurrences delimit an empty field. If the character occurs at the beginning or the end of the line, that too delimits an empty field. The space character is the only single character which does not follow these rules."
(https://docs.freebsd.org/info/gawk/g...eparators.html)
Plus bas dans le doc, on lit bien qu'avec le FS par défaut (càd space) les premiers espaces ne sont pas lus, mais dès qu'on indique en dur FS = " ", il prend le(s) premier(s) espace(s) comme le champ $1 : " There is an important difference between the two cases of `FS = " "' (a single blank) and `FS = "[ \t]+"' ... "
Comme j'ai des fichiers qui peuvent avoir des espaces en premières colonnes ou pas (càd commençant avec de suite une valeur qui est donc en $1), je ne peux extraire le premier champ en $2 forcément. Je suis bien embêté.
Qqn saurait-il comment rédiger ce FS, et si possible pas en script (càd -F"....") mais dans un BEGIN
Merci !
-
Bonjour :coucou:
Si la source est sale, ne peux-tu pas demander à ton fournisseur un fichier propre ? Ne peux-tu pas nettoyer le fichier avant de le traiter ?
Cela me semble être du bricolage mais tu peux faire une accolade (un code pour chaque ligne) qui rameutent les champs vers le champ 1.
-
salut,
même conseil, le mieux est encore de travailler directement sur un fichier propre, si jamais c'est pas une option une méthode un peu cradingue mais qui peut aider :
Code:
awk -F'[ ,]+' '{gsub(/^[ ,]+/,"",$0)} {print $1}'
en clair pour chaque ligne (pas seulement dans la clause BEGIN donc) on zappe explicitement les séparateurs du début et on met à jour $0, et par là le découpage des variables positionnelles qui suivent
-
Merci à vous. En effet, j'étais à 2 doigts de faire un {for (all$) substr($i,1,length($i)-1) dans chaque ligne pour enlever la virgule collée en fin de chaque champ :roll:
En fait j'avais oublié qu'un code awk peut s'écrire avec plusieurs {parties} qui s'exécutent l'une après l'autre, dont le gsub que je n'ai vraiment jamais utilisé.
Je viens de gagner +3 XP en awk, ça progresse ... :mrgreen: