【问题标题】:Replacing variable values in defined string through awk / xargs通过 awk / xargs 替换定义字符串中的变量值
【发布时间】: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

编写一个小循环并逐行调用会产生开销,所以不要这样做。有什么想法可以以最佳方式完成吗?

【问题讨论】:

    标签: unix awk xargs


    【解决方案1】:

    使用 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 ;
    

    【讨论】:

      猜你喜欢
      • 2017-11-17
      • 2013-11-04
      • 2012-06-03
      • 2020-07-13
      • 2022-06-15
      • 2014-06-12
      • 2021-09-09
      • 1970-01-01
      • 2012-02-17
      相关资源
      最近更新 更多