Unix 通过awk/xargs替换定义字符串中的变量值

Unix 通过awk/xargs替换定义字符串中的变量值,unix,awk,xargs,Unix,Awk,Xargs,我们在bash中动态生成一个字符串,以便在oracle数据库中插入数据。绳子就像 > echo $str1 insert into tbl select '$jobid','$1','$2','$3','$sdate' from dual ; 这里是变量$1,$2。。。是动态的,最多可以达到10 现在,我们在一个文件中有了与上面字符串中的数字变量($1,$2..)相同数量的“:”分隔数据列 这里的挑战是将$1替换为第一列数据,将$2替换为第二列数据,依此类推。这需要对数据集的所有行执行

我们在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


写一个小循环并逐行调用会增加开销,所以不要这样做。您知道如何以最佳方式执行此操作吗?

使用Awk,对于每条记录,使用
gsub
函数将模板中的每个文本$n替换为第n个字段的值,并打印结果

awk -F: -v tmpl="$str1" '{
  out = tmpl
  for (i=1; i<=NF; i++)
    gsub(("\\$" i), $i, out)
  print out
}' file
awk-F:-v tmpl=“$str1”{
out=tmpl
对于(i=1;i out=tmpl
>对于(i=1;i gsub((“\\$”i),$i,out)
>打印出来
>}文件
插入到tbl中,从dual中选择“$jobid”、“ONLINE”、“odr1\u redo\u 06a.log”、“NO”、“$sdate”;
插入到tbl中,从dual中选择“$jobid”、“ONLINE”、“odr1\u redo\u 06b.log”、“NO”、“$sdate”;
插入到tbl中,从dual中选择“$jobid”、“ONLINE”、“odr1\u redo\u 05a.log”、“NO”、“$sdate”;
$ 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 ;