1

我需要从 file.csv 生成一个 file.sql 文件,所以我使用这个命令:

cat file.csv |sed "s/\(.*\),\(.*\)/insert into table(value1, value2)
values\('\1','\2'\);/g" > file.sql

它工作得很好,但是当值超过 9 时(例如对于 \10、\11 等...),它只考虑第一个数字(在这种情况下是 \1)并忽略其余部分。

我想知道我是否错过了什么,或者是否有其他方法可以做到这一点。

谢谢 !

编辑:
不工作的例子:

我的 file.csv 看起来像

2013-04-01 04:00:52,2,37,74,40233964,3860,0,0,4878,174,3,0,0,3598,27.00,27

我得到了什么

插入表
val1,val2,val3,val4,val5,val6,val7,val8,val9,val10,val11,val12,val13,val14,val15,val16

值 ('2013-04-01 07:39:43',
2,37,74,36526530,3877,0,0,6080,
2013-04-01 07:39:430,2013-04-01 07:39 :431,
2013-04-01 07:39:432,2013-04-01 07:39:433,
2013-04-01 07:39:434,2013-04-01 07:39:435,
2013-04 -01 07:39:436);

在第九个元素之后,我得到第一个而不是第 10、11 个等......

4

2 回答 2

1

据我所知sed,支持 9 个反向引用是有限制的。它可能已在较新的版本中被删除(尽管不确定)。你最好使用perlawk为此。

以下是您的做法awk

$ cat csv
2013-04-01 04:00:52,2,37,74,40233964,3860,0,0,4878,174,3,0,0,3598,27.00,27

$ awk 'BEGIN{FS=OFS=","}{print "insert into table values (\x27"$1"\x27",$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16 ");"}' csv
insert into table values ('2013-04-01 04:00:52',2,37,74,40233964,3860,0,0,4878,174,3,0,0,3598,27.00,27);

这是你可以做的perl

$ perl -ple 's/([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+)/insert into table values (\x27$1\x27,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16);/' csv
insert into table values ('2013-04-01 04:00:52',2,37,74,40233964,3860,0,0,4878,174,3,0,0,3598,27.00,27);
于 2013-06-26T13:22:40.380 回答
1

尝试一个awk脚本(基于@JS웃 解决方案):

脚本.awk

#!/usr/bin/env awk
# before looping the file
BEGIN{
  FS="," # input separator
  OFS=FS # output separator
  q="\047" # single quote as a variable
}

# on each line (no pattern)
{
  printf "insert into table values ("
    print q $1 q ", "
    print $2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16
  print ");"
}

运行

awk -f script.awk file.csv

单线

awk 'BEGIN{OFS=FS=","; q="\047" } { printf "insert into table values (" q $1 q ", " $2","$3","$4","$5","$6","$7","$8","$9","$10","$11","$12","$13","$14","$15","$16 ");" }' file.csv
于 2013-06-26T13:53:00.040 回答