Unix 通过awk/xargs替换定义字符串中的变量值
我们在bash中动态生成一个字符串,以便在oracle数据库中插入数据。绳子就像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替换为第二列数据,依此类推。这需要对数据集的所有行执行
> 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 ;