如何使用awk在列周围添加单引号

时间:2013-05-10 20:55:15

标签: bash sed awk

只是想知道如何在字段周围添加单引号,因此我可以将其导入mysql而不会出现警告或错误。

我有一个包含大量内容的csv文件。

16:47:11,3,r-4-VM,250000000.,0.50822578824,131072,0,0,0,0,0

期望的输出

'16:47:07','3','r-4-VM','230000000.','0.466028518635','131072','0','0','0','60','0'

我真的不知道从哪里开始,非常感谢您的帮助。

6 个答案:

答案 0 :(得分:10)

你可以试试这个

awk -F"," -v quote="'" -v OFS="','" '$1=$1 {print quote $0 quote}' file
  1. 将每个分隔符(,逗号)替换为(','quote-comma-quote) - > (-F"," -v OFS="','")
  2. 在行的开头和结尾添加引号 - > (print quote $0 quote)

答案 1 :(得分:1)

#!/usr/bin/awk -f

BEGIN { FS=OFS=","}

{
    for (i = 1; i <= NF; ++i)
        $i = "'" $i "'"
    print
}

首先,将FS(字段分隔符)设置为逗号;还将输出字段分隔符OFS设置为逗号。

对于每个输入行,遍历所有字段。 NF是从当前行解析出的字段数。将每个字段设置为由单引号括起来的值。

完成更新字段后,打印修改后的行。

答案 2 :(得分:1)

试试这个:

awk '{gsub(/^|$/,"\x027");gsub(/,/,"\x027,\x027")}7' file

例如

kent$  echo "16:47:11,3,r-4-VM,250000000.,0.50822578824,131072,0,0,0,0,0"|awk '{gsub(/^|$/,"\x027");gsub(/,/,"\x027,\x027")}7'
'16:47:11','3','r-4-VM','250000000.','0.50822578824','131072','0','0','0','0','0'

答案 3 :(得分:1)

这可能适合你(GNU sed):

sed -r 's/[^,]+/'\''&'\''/g' file

或:

sed -r "s/[^,]+/'&'/g" file

答案 4 :(得分:0)

awksed不会(轻松地)确定是否对字段分隔符(,)进行了转义。 csv文件格式通过将整个字段括在双引号中来使字段中的,字符转义(请参见RFC4180的2.6节)。

正如我在this answer中所述,一种更可靠的方法是使用csv库,而不是使用正则表达式等将其解析为文本。

我发现Python的库是最佳选择,因为它是:

  1. 除了Python本身以外,无其他繁琐的依赖而广泛可用;
  2. 对您使用的Python版本不是特别敏感;
  3. 很适合嵌入到shell脚本中;和
  4. 非常紧凑(只需一根纸即可!)

根据问题的标签,我怀疑这些条件也会吸引您。

因此,请尝试以下操作:

QUOTE_CSV_PY="import sys; import csv; csv.writer(sys.stdout, quoting=csv.QUOTE_ALL, quotechar=\"'\").writerows(csv.reader(sys.stdin))"
python -c "$QUOTE_CSV_PY" < file

要分解它:

  • QUOTE_CSV_PY是一个包含Python单行命令的shell变量
  • Python命令简单地:
    • 导入标准的sys和csv模块;
    • 创建一个设置为stdout到标准输出(QUOTE_ALL)的csv编写器,以便所有字段都使用quotechar设置为单引号;
    • 为csv编写器提供一个从标准输入(stdin)中读取的csv阅读器。
  • 第二行仅将单行代码传递给python解释器,然后将csv文件(称为file)馈送到其stdin中。

答案 5 :(得分:0)

awk 'BEGIN{FS=OFS=","}{for (i=1;i<=NF;++i)  $i="~"$i"~"}{print}' $input_csv_file

这有效。在这里,我用~将所有csv文件列括起来。