文件中的数据举例:
955,2018,10,1, ,FMSCCCM ,2018-10-19 15:04:55.511
602,2018,10,1,602,44638994,2018-10-22 02:49:28.944
608,2018,10,1,608,44638994,2018-10-22 02:49:28.946
610,2018,10,1,610,44638994,2018-10-22 02:49:28.948
期望结果是生成insert SQL:
insert into tablename values ('955','2018','10','1',' ','FMSCCCM' ,'2018-10-19 15:04:55.511');
insert into tablename values ('602','2018','10','1','602 ','44638994' ,'2018-10-22 02:49:28.944');
insert into tablename values ('608','2018','10','1','608 ','44638994' ,'2018-10-22 02:49:28.946');
insert into tablename values ('610','2018','10','1','610 ','44638994' ,'2018-10-22 02:49:28.948);
希望用shell 写个脚本,数据文件中的列数和行数是不确定的,所以行和列都不能写死。从
文件中读取每行每列的值放入SQL insert 语句中的values中。感谢各位大神提供指导和帮助!
我目前写的shell的把列写死了,但是实际情况中列数每次都不一样,可能7列,也可能十几列的,所以这里就不会写了!awk -F ","'{print $1}' 中$后面的数字可以是变量吗?
while read line
do
echo $line > tmp
col1=awk -F "," '{print $1}' tmp
col2=awk -F "," '{print $2}' tmp
col3=awk -F "," '{print $3}' tmp
col4=awk -F "," '{print $4}' tmp
col5=awk -F "," '{print $5}' tmp
col6=awk -F "," '{print $6}' tmp
col7=awk -F "," '{print $7}' tmp
echo "insert into tablename values ('$col1','$col2','$col3','$col4','$col5','$col6','$col7');"
done < test4.log
参考GPT和自己的思路:
你可以使用 awk 命令来处理这个问题,而不需要将每个字段预定义为变量。具体的代码如下:
awk -F "," '{printf "insert into tablename values (\x27%s\x27,\x27%s\x27,\x27%s\x27,\x27%s\x27,\x27%s\x27,\x27%s\x27,\x27%s\x27);\n",$1,$2,$3,$4,$5,$6,$7}' test4.log
这个命令会读取 test4.log 文件中的每行内容,使用逗号作为分隔符,并根据每列的内容生成一个对应的 insert 语句。此处使用 printf 命令来输出 insert 语句,并使用 \x27 的方式生成单引号。
如果文件中的列数不确定,也可以考虑使用 awk 的 $NF 变量来获取每行的最后一个字段,从而避免预定义所有的变量。具体的命令如下:
awk -F "," '{sql="insert into tablename values (\x27"$1"\x27";";for(i=2;i<=NF;i++){sql=sql"\x27,\x27"$i"\x27";}sql=sql");\n";print sql}' test4.log
这个命令中使用一个 for 循环来遍历每行的所有字段,并使用字符串拼接的方式生成 insert 语句。此处使用 print 命令输出 insert 语句,而不是 printf 命令。