我们在bash中动态生成一个字符串,以便在oracle数据库中插入数据。该字符串类似于
> echo $str1
insert into tbl select '$jobid','$1','$2','$3','$sdate' from dual ; 这里变量$1,$2 ..。是动态的,最高可达10
现在,我们在一个文件中具有与数字变量( $1,$2)相同数量的':‘分隔数据列数。)在上面的字符串中。
这里的挑战是将$1替换为第一列数据,将$2替换为第二列数据,依此类推。这需要为数据集的所有行完成,并且需要生成一个单独的文件,使用"insert“字符串作为基础,并使用文件中的替换数据。
例如,样本数据
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编写一个小循环并逐行调用会产生开销,所以最好不要这么做。你知道如何以最优的方式做到这一点吗?
发布于 2020-05-28 16:05:36
使用Awk,对于每条记录,通过gsub函数将模板中的第n个字段的值替换为每个文字$n,并打印结果。
awk -F: -v tmpl="$str1" '{
out = tmpl
for (i=1; i<=NF; i++)
gsub(("\\$" i), $i, out)
print out
}' file概念验证:
$ str1="insert into tbl select '\$jobid','\$1','\$2','\$3','\$sdate' from dual ;"
$
$ awk -F: -v tmpl="$str1" '{
> out = tmpl
> for (i=1; i<=NF; i++)
> gsub(("\\$" i), $i, out)
> print out
> }' file
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 ;https://stackoverflow.com/questions/62059598
复制相似问题