首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用awk用单引号包装单个字段

使用awk用单引号包装单个字段
EN

Stack Overflow用户
提问于 2016-07-19 14:03:45
回答 4查看 1.3K关注 0票数 1

有许多例子使用awk用双引号对字段进行包装。我一直试图用单引号在postgresql中封装一个字段,以加载csv文件,但没有成功。

以下是我的几次尝试:

代码语言:javascript
复制
#!/usr/bin/awk -f
BEGIN { FS=OFS=","}

{
  for (i = 1; i <= NF; ++i)
    if($i == 9)
    {
        $i = "\'' $i \''"
    }

  print $0 >> "output.csv"
}

awk 'BEGIN { OFS=FS="," } { $9= ""'" $9 ""'"} 1' container.csv > output.csv

还有..。

代码语言:javascript
复制
awk -v q="'" 'BEGIN { FS="," } { sub($9, ""\'"&"\'"" );print}' container.csv > output.csv
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-07-19 14:07:34

代码语言:javascript
复制
$ awk 'BEGIN { FS = OFS = "," } { $9= "'"'"'" $9 "'"'"'"; print }' \
>    <<<one,two,three,four,five,six,seven,eight,nine,ten
one,two,three,four,five,six,seven,eight,'nine',ten

这里的棘手之处在于让你的引号通过bash进入awk --如果在单引号命令行参数中有一个单引号,那么它将被视为结束从'BEGIN开始的引用上下文,而不是发送给awk的字面内容。

因此,"'"'"'"做了必要的诡计:

  • 第一个字符"是文字字符,传递给awk。
  • 第二个字符'是语法,用于告诉shell结束从命令行前面开始的引号。
  • 第三个字符,",是句法,用来开始一个新的(双引号)引用上下文.
  • 第四个字符,',是上下文中的文字。
  • 第五个字符"结束从字符3开始的双引用上下文。
  • 第六个字符'是句法,恢复以字符2结尾的单引号上下文。
  • 第七个字符"是文字字符,传递给awk。

因此,实际传递给awk 的在上面的中用作脚本的内容是:

代码语言:javascript
复制
BEGIN { FS = OFS = "," } { $9= "'" $9 "'"; print }

如果您愿意,可以直接将...which放在文件中;如果那个awk脚本有一个#!/usr/bin/awk -f shebang,那么它在作为命令直接执行时应该能工作。

顺便说一句,如果您的shell是bash,那么还有一个替代的引用上下文,它将使这一点变得不那么糟糕:

代码语言:javascript
复制
$ awk $'BEGIN { FS = OFS = "," } { $9= "\'" $9 "\'"; print }'

$''内部,反斜杠转义被尊重-- \t是选项卡,\f是字段分隔符,\r是换行符,--与我们的观点相关-- \'是单引号。

票数 1
EN

Stack Overflow用户

发布于 2016-07-19 14:08:37

这在脚本中要容易得多,因为您不需要担心随附的引号:

代码语言:javascript
复制
BEGIN { FS = OFS = "," }

{ 
    $9 = "'" $9 "'"
    print
}

我不知道你的圈套该怎么做!

使用Charles善意提供的输入进行测试:

代码语言:javascript
复制
$ cat file
one,two,three,four,five,six,seven,eight,nine,ten
$ awk -f script.awk file
one,two,three,four,five,six,seven,eight,'nine',ten
票数 1
EN

Stack Overflow用户

发布于 2016-07-19 15:31:50

只要在需要单引号的地方使用八进制转义序列\047

代码语言:javascript
复制
awk 'BEGIN{FS=OFS=","} { $9= "\047" $9 "\047"; print }'

这避免了引用中的任何复杂性,也避免了其他方法带来的任何意外。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38460805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档