3

次のsqlコードは、input.txt への入力としてテキスト ファイルに挿入されます。

insert into t_agg_sgsn_gprs_usage
select
    served_imsi as imsi,
    served_msisdn as msisdn,
    NVL(cell_identity,'-1') as cell_id,
    NVL(trim(to_char(location_area_code,'99999999')),'UNKNOWN'),
    substr(served_imei,1,8) tac_code,
    to_char(to_timestamp(record_opening_time,'YYYYMMDDHH24MISS'),'YYYYMMDD')
        as call_dt,
    'ajay' as loaded_dt,
    count(1) as cdr_count,
    sum(data_volume_uplink) as uploaded_data_volume,
    sum(data_volume_downlink) as downloaded_data_volume,
    case
        when substr(imsi,6,2)='65'
        then substr(imsi,1,9)
        else substr(imsi,1,5)
    end imsi_prefix
from
    t_cdrc_sgsn_pdp_18
    where loaded_dt LIKE 'ajay%' AND trim(served_imsi) != ''
        AND trim(served_msisdn) != '' AND trim(served_imei) != ''
    group by imsi, msisdn, tac_code, cell_id, location_area_code, call_dt;

指定された日付まで、日付が1ずつ増分され、1つのSQLファイル(changer.sql)に追加された出力を提供するUNIXスクリプトを作成しています。

insert into t_agg_sgsn_gprs_usage
select
        served_imsi as imsi,
        served_msisdn as msisdn,
        NVL(cell_identity,'-1') as cell_id,
        NVL(trim(to_char(location_area_code,'99999999')),'UNKNOWN'),
        substr(served_imei,1,8) tac_code,
        to_char(to_timestamp(record_opening_time,'YYYYMMDDHH24MISS'),'YYYYMMDD') as call_dt,
        '2012-10-17' as loaded_dt,
        count(1) as cdr_count,
        sum(data_volume_uplink) as uploaded_data_volume,
        sum(data_volume_downlink) as downloaded_data_volume,
        case when substr(imsi,6,2)='65' then substr(imsi,1,9) else substr(imsi,1,5) end imsi_prefix
from
        t_cdrc_sgsn_pdp_18
        where loaded_dt LIKE '2012-10-17%' AND trim(served_imsi) != '' AND trim(served_msisdn) != '' AND trim(served_imei) != ''
        group by imsi, msisdn, tac_code, cell_id, location_area_code, call_dt;

insert into t_agg_sgsn_gprs_usage
select
        served_imsi as imsi,
        served_msisdn as msisdn,
        NVL(cell_identity,'-1') as cell_id,
        NVL(trim(to_char(location_area_code,'99999999')),'UNKNOWN'),
        substr(served_imei,1,8) tac_code,
        to_char(to_timestamp(record_opening_time,'YYYYMMDDHH24MISS'),'YYYYMMDD') as call_dt,
        '2012-10-18' as loaded_dt,
        count(1) as cdr_count,
        sum(data_volume_uplink) as uploaded_data_volume,
        sum(data_volume_downlink) as downloaded_data_volume,
        case when substr(imsi,6,2)='65' then substr(imsi,1,9) else substr(imsi,1,5) end imsi_prefix
from
        t_cdrc_sgsn_pdp_18
        where loaded_dt LIKE '2012-10-18%' AND trim(served_imsi) != '' AND trim(served_msisdn) != '' AND trim(served_imei) != ''
        group by imsi, msisdn, tac_code, cell_id, location_area_code, call_dt;

そしてchanger.sql、指定された終了日まで、インクリメントしてファイルに追加し続けます。

以下は私がこれまでに持っているものですが、それでも期待される結果は得られません:

startdate = `date +"%y-%m-%d"`
set startdate =  2012-10-17
enddate = `date “+%y-%m-%d` 
set enddate = 2012-12-22
for($startdate <= $enddate)
do
for file in $(grep -il "ajay" input.txt)
do
sed -e "s/ajay/$startdate/ig" $file >> changer.sql
done
$startdate --startdate="-1 days ago"
done
4

1 に答える 1

3

問題が bash のみに関係していることを考慮すると、次のエラーがあります。

1 - あなたは何のためにこれをしますか:

startdate=...
set startdate=...

2 - bash での代入の構文が間違っています。次の間に空白を入れないでください。

rvalue=lvalue
startdate=`date +"%y-%m-%d"`

3 - この構文はforループには不適切です。whileループが必要だと思います:

for ($startdate <= $enddate)  *wrong*
do ...
done

while (( $startdate <= $enddate )); do
    ...
done

4 - 何を期待していますか:

$startdate --startdate="-1 days ago"

$startdate の値を で減らそうとするかもしれ1 dayません。これを行う必要があるためです。

startdate=$(date -d $startdate' -1 days' +"%y-%m-%d")
于 2012-12-22T14:37:40.603 に答える