有许多例子使用awk用双引号对字段进行包装。我一直试图用单引号在postgresql中封装一个字段,以加载csv文件,但没有成功。
以下是我的几次尝试:
#!/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
还有..。
awk -v q="'" 'BEGIN { FS="," } { sub($9, ""\'"&"\'"" );print}' container.csv > output.csv发布于 2016-07-19 14:07:34
$ 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 的在上面的中用作脚本的内容是:
BEGIN { FS = OFS = "," } { $9= "'" $9 "'"; print }如果您愿意,可以直接将...which放在文件中;如果那个awk脚本有一个#!/usr/bin/awk -f shebang,那么它在作为命令直接执行时应该能工作。
顺便说一句,如果您的shell是bash,那么还有一个替代的引用上下文,它将使这一点变得不那么糟糕:
$ awk $'BEGIN { FS = OFS = "," } { $9= "\'" $9 "\'"; print }'在$''内部,反斜杠转义被尊重-- \t是选项卡,\f是字段分隔符,\r是换行符,--与我们的观点相关-- \'是单引号。
发布于 2016-07-19 14:08:37
这在脚本中要容易得多,因为您不需要担心随附的引号:
BEGIN { FS = OFS = "," }
{
$9 = "'" $9 "'"
print
}我不知道你的圈套该怎么做!
使用Charles善意提供的输入进行测试:
$ 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发布于 2016-07-19 15:31:50
只要在需要单引号的地方使用八进制转义序列\047:
awk 'BEGIN{FS=OFS=","} { $9= "\047" $9 "\047"; print }'这避免了引用中的任何复杂性,也避免了其他方法带来的任何意外。
https://stackoverflow.com/questions/38460805
复制相似问题