SED给我问题

时间:2019-11-08 19:02:38

标签: bash sed

我正在研究一个非常基本的脚本(我是菜鸟),该脚本可以执行以下操作:

1)从文本文件(keyList.txt)抓取帐户密钥->密钥格式如下:1002000222,1002000400

2)对于每个键,我都要进行遍历并将其插入(使用SED)到另一个文本文件中包含的SQL查询中。

3)查询示例:

UPSERT INTO ACCT_HIST (ACCT_KEY,CLS_TYP_KEY,DT_KEY,PRD_TYP_KEY,FEE_IND,LIAB_IND,CCY_CD,JOB_SEQ,UV_AMT)SELECT ACCT_KEY,CLS_TYP_KEY,current_date(),CREATED_TMSTP,LST_UPD_TMSTP,LST_UPD_BY,'ACCT TRANSFER DEACTIVATION',DELETE_FLAG,'N'FROM ACCT_HIST WHERE ACCT_KEY IN (101000033333) AND REC_ACTV_IND = 'Y' AND DT_KEY < 20191009;

下面是我的Bash代码段,但为总结问题,SED一次只替换括号中一个键的值,而不是将它们都放在相同的括号空间中。现在,下面的代码运行良好。

#!/bin/bash

now=$(date +"%Y%m%d-%H:%M")

cp acct_transfer_soft_del_list.csv keyList_$now.txt

for key in $(<keyList_$now.txt)
do
        sed "s/([^)]*)/(${key})/3" hbase.txt >> queries_$now.txt
done

hbase.txt保存查询,但是我不想永久更改它们,因此我将输出发送到querys_ $ now.txt。如前所述,只有第二个键被发送到查询文件,而不是两个都发送。任何提示均应适用。

1 个答案:

答案 0 :(得分:0)

请注意,您有IFS=,

这(可能)是通过不必要的行为破坏了您的密钥。

我承认我不确定我是否完全了解您的需求,但我认为您可以利用第一个周期来获得所需的一切。

重复使用代码,您可以执行以下操作:

#!/bin/bash

now=$(date +"%Y%m%d-%H:%M")

IFS=","
while read f1 f2
do
  echo "$f1,$f2"
  sed "s/([^\)]*)/($f1,$f2)/3 " hbase.txt >> queries_$now.txt
done < acct_transfer_soft_del_list.csv > keyList_$now.txt

无论如何,我无法弄清楚您的while周期:它似乎只是对文件进行简单的复制。 您可以使用cp acct_transfer_soft_del_list.csv keyList_$now.txt

避免