假设我有这个文件由制表符分隔:
This is a cat,dog
I run around the house,garage
我想用逗号替换所有选项卡实例(我可以做那部分),但也将所有带逗号的单词用引号括起来。所以生成的文件看起来像:
This,is,a,"cat,dog"
I,run,around,the,"house,garage"
我该怎么做呢?
这是一种方法:
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。1
调用默认规则{ print $0 }
。史蒂夫是对的,在这种情况下 sed 更简短。您可以通过使用正则表达式(从 steve 借来)并附加 OFS 和 FS 的设置(用 GNU awk 测试)来缩短它:
awk '{ $0 = gensub(/[^\t]*,[^\t]*/, "\"&\"", "g"); $1=$1 } 1' FS='\t' OFS=,
使用 sed 和 tr,还可以处理单词之间的空格:
sed 's/\([a-zA-Z]*[ ]*,[ ]*[a-zA-Z]*\)/"\1"/' input | tr '\t' ','
awk
可能不是这项工作的正确工具。我认为sed
会是一个更好的选择。这是我要做的:
sed 's/[^\t]*,[^\t]*/"&"/g;s/\t/,/g' file