Comment utiliser AWK pour inclure des champs avec des virgules entre guillemets?

Supposons que ce fichier soit délimité par des tabulations:

This is a cat,dog I run around the house,garage 

Je veux remplacer toutes les instances d’tabs par des virgules (je peux faire cette partie), mais aussi envelopper tous les mots avec des virgules entre guillemets. Donc, le fichier résultant ressemblerait à ceci:

 This,is,a,"cat,dog" I,run,around,the,"house,garage" 

Comment pourrais-je y aller?

Voici une façon de le faire:

 awk -v FS='\t' -v OFS=, '{$1=$1; for(i=1; i<=NF; i++) if($i ~ /,/) $i = "\"" $i "\"" } 1' 

Sortie:

 This,is,a,"cat,dog" I,run,around,the,"house,garage" 

Explication:

  • OFS=, et $1=$1 fait que awk remplace FS par OFS.
  • La boucle for vérifie chaque champ et le place entre guillemets s'il contient une virgule.
  • Le 1 à la fin appelle la règle par défaut { print $0 } .

modifier

steve a raison, sed est plus bref dans ce cas. Vous pourriez le raccourcir en utilisant une expression régulière (empruntée à steve) et en ajoutant les parameters de OFS et de FS (testés avec GNU awk):

 awk '{ $0 = gensub(/[^\t]*,[^\t]*/, "\"&\"", "g"); $1=$1 } 1' FS='\t' OFS=, 

En utilisant sed et tr, gère également les espaces entre les mots:

  sed 's/\([a-zA-Z]*[ ]*,[ ]*[a-zA-Z]*\)/"\1"/' input | tr '\t' ',' 

awk n’est probablement pas le bon outil pour ce travail. Je pense que sed serait une meilleure option. Voici ce que je ferais:

 sed 's/[^\t]*,[^\t]*/"&"/g;s/\t/,/g' file