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"
OFS=,
et $1=$1
fait que awk remplace FS par OFS. 1
à la fin appelle la règle par défaut { print $0 }
. 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