如何使用AWK用引号括起逗号字段?

时间:2012-12-12 23:40:49

标签: regex unix awk

假设我有这个文件由制表符分隔:

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

我想用逗号替换所有选项卡实例(我可以做那部分),但也用引号将所有带逗号的单词包装在其中。因此生成的文件看起来像:

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

我将如何做到这一点?

3 个答案:

答案 0 :(得分:3)

这是一种方法:

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

输出:

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

说明:

  • OFS=,$1=$1使awk用OFS替换FS。
  • for循环检查每个字段,如果它包含逗号,则用双引号括起来。
  • 最后的1会调用默认规则{ print $0 }

修改

steve是对的,在这种情况下,sed更简洁。你可以通过使用正则表达式(借用史蒂夫)并附加OFS和FS的设置(用GNU awk测试)来缩短它:

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

答案 1 :(得分:1)

使用sed和tr,还可以处理单词之间的空格:

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

答案 2 :(得分:1)

awk可能不适合这项工作。我认为sed会是更好的选择。这就是我要做的事情:

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