首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过awk / xargs替换已定义字符串中的变量值

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

Stack Overflow用户
提问于 2020-05-28 15:51:06
回答 1查看 32关注 0票数 2

我们在bash中动态生成一个字符串,以便在oracle数据库中插入数据。该字符串类似于

代码语言:javascript
复制
> echo $str1
insert into tbl select '$jobid','$1','$2','$3','$sdate' from dual ; 

这里变量$1,$2 ..。是动态的,最高可达10

现在,我们在一个文件中具有与数字变量( $1,$2)相同数量的':‘分隔数据列数。)在上面的字符串中。

这里的挑战是将$1替换为第一列数据,将$2替换为第二列数据,依此类推。这需要为数据集的所有行完成,并且需要生成一个单独的文件,使用"insert“字符串作为基础,并使用文件中的替换数据。

例如,样本数据

代码语言:javascript
复制
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 ;

所需输出应为

代码语言:javascript
复制
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中使用字符串作为外部变量。不走运

代码语言:javascript
复制
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

编写一个小循环并逐行调用会产生开销,所以最好不要这么做。你知道如何以最优的方式做到这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-28 16:05:36

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

代码语言:javascript
复制
awk -F: -v tmpl="$str1" '{
  out = tmpl
  for (i=1; i<=NF; i++)
    gsub(("\\$" i), $i, out)
  print out
}' file

概念验证:

代码语言:javascript
复制
$ 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 ;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62059598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档