【发布时间】:2020-09-15 11:12:38
【问题描述】:
我们在 bash 中动态生成一个字符串以将数据插入到 oracle 数据库中。字符串就像
> echo $str1
insert into tbl select '$jobid','$1','$2','$3','$sdate' from dual ;
这里的变量 $1,$2 ... 是动态的,最高可达 10
现在我们的文件中的数据具有相同数量的“:”分隔数据列,因为上面的字符串中有数字变量($1,$2..)。
这里的挑战是用第一列数据替换 $1,用第二列替换 $2,依此类推。这需要对数据集的所有行执行此操作,并且需要生成一个单独的文件,其中“插入”字符串作为基础并使用文件中的替换数据。
例如样本数据
cat test.dat
ONLINE:odr1_redo_06a.log:NO
ONLINE:odr1_redo_06b.log:NO
ONLINE:odr1_redo_05a.log:NO
and the string is
echo $str1
insert into tbl select '$jobid','$1','$2','$3','$sdate' from dual ;
需要的输出应该是
insert into tbl select '$jobid','ONLINE','odr1_redo_06a.log','NO','$sdate' from dual ;
insert into tbl select '$jobid','ONLINE','odr1_redo_06b.log','NO','$sdate' from dual ;
insert into tbl select '$jobid','ONLINE','odr1_redo_05a.log','NO','$sdate' from dual ;
尝试在 awk 中使用字符串作为外部变量。没有运气
cat test.dat | awk -F: -v var="$str1" '{print var}'
insert into tbl select '$jobid','$1','$2','$3','$sdate' from dual ;
insert into tbl select '$jobid','$1','$2','$3','$sdate' from dual ;
insert into tbl select '$jobid','$1','$2','$3','$sdate' from dual ;
or xargs
sed 's/:/ /g' test.dat | xargs -n3 bash -c "echo $str1"
insert into tbl select $jobid,$1,$2,$3,$sdate from dual
insert into tbl select $jobid,$1,$2,$3,$sdate from dual
insert into tbl select $jobid,$1,$2,$3,$sdate from dual
编写一个小循环并逐行调用会产生开销,所以不要这样做。有什么想法可以以最佳方式完成吗?
【问题讨论】: