3

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

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

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

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

我该怎么做呢?

4

3 回答 3

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=$1awk 用 OFS 替换 FS。
  • for 循环检查每个字段,如果它包含逗号,则将其括在双引号中。
  • 最后1调用默认规则{ print $0 }

编辑

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

awk '{ $0 = gensub(/[^\t]*,[^\t]*/, "\"&\"", "g"); $1=$1 } 1' FS='\t' OFS=,
于 2012-12-12T23:47:40.403 回答
1

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

 sed 's/\([a-zA-Z]*[ ]*,[ ]*[a-zA-Z]*\)/"\1"/' input | tr '\t' ','
于 2012-12-13T00:10:51.887 回答
1

awk可能不是这项工作的正确工具。我认为sed会是一个更好的选择。这是我要做的:

sed 's/[^\t]*,[^\t]*/"&"/g;s/\t/,/g' file
于 2012-12-13T00:22:45.713 回答