我有很多Teradata SQL文件(下面是其中一个文件的示例代码)。
create multiset volatile table abc_mountain_peak as(
select
a.kkpp_nip as nip,
from BM_RETABLE_BATOK.EDETON a
) with data on commit preserve rows;
create multiset table qazxsw_asd_1 as (
select
a.address_id,
from DE30T_BIOLOB.HGG994P_ABS_ADDRESS_TRE a,
) with data on commit preserve rows;
create multiset volatile table xyz_sea_depth as(
select
a.trip,
from tele_line_tryt a
) with data on commit preserve rows;
CREATE multiset table wsxzaq_zxc_2 AS (
SELECT
a.bend_data
FROM lokl_station a ,
) WITH data on commit preserve rows;
CREATE multiset table rfvbgt_ttuop_3 AS (
SELECT
a.heret_bini
FROM fvgty_blumion a ,
) WITH data on commit preserve rows;
DROP qazxsw_asd_1;
DROP wsxzaq_zxc_2;
.EXIT
我需要做的是创建一个脚本(bash),它可以验证多重表是否被删除。 创建了两种表:
在我的示例代码中,3个多集表中的2个被删除(这是正确的),其中一个不是(这是不正确的)。 你有任何想法如何创建可以验证类似的东西的脚本(提供信息,一个表,或一些表不被删除)?我真的是bash的初学者。我的想法(可能是错误的)是创建包含多个集表名称的数组(但不是多个集合的易失性表),然后创建另一个表,其中包含' drop'和删除表的名称,最后检查第一个数组中的每个表是否也在第二个数组中。 你怎么看?任何帮助将不胜感激。
答案 0 :(得分:1)
我会使用sed分两部分进行:
创建创建列表:
sed -ne 's/^.*create multiset \(volatile \)\?table \(\w\+\).*$/\2/Ip' INPUT FILES | sort > creates.txt
创建删除列表:
sed -ne 's/^.*drop \(\w\+\).*$/\1/Ip' INPUT FILES | sort > drops.txt
创建和删除的表:
join creates.txt drops.txt
已创建但未删除的表:
combine creates.txt not drops.txt
答案 1 :(得分:1)
通过读取文件中的每一行,将与multiset table
命令关联的表名隔离成一个数组(dropnames
),您可以相当轻松地完成此操作,然后隔离{后面的表名称{1}}语句到另一个数组(DROP
)。然后,只需要比较两个数组,找到一个不在另一个数组中的表。像下面这样的简短脚本将为您完成:
droptable
<强>输出强>
#!/bin/bash
declare -a tmparray ## declare array names
declare -a dropnames
declare -a droptable
volstr="multiset volatile table" ## set query strings
dropstr="multiset table"
## read all lines and collect table names
while read -r line; do
[[ $line =~ $dropstr ]] && { ## collect "multiset table" names
tmparray=( $line )
dropnames+=( ${tmparray[3]} )
}
[[ $line =~ DROP ]] && { ## collect DROP table names
tmp="${line/DROP /}"
droptable+=( ${tmp%;*} )
}
unset array
done
## compare droptable to dropnames, print missing table(s)
if [ ${#dropnames[@]} -gt ${#droptable[@]} ]; then
printf "\n The following tables are missing from DROP tables:\n\n"
for i in "${dropnames[@]}"; do
found=0
for j in "${droptable[@]}"; do
[ $i = $j ] && found=1 && continue
done
[ $found -eq 0 ] && printf " %s\n" "$i"
done
elif [ ${#dropnames[@]} -lt ${#droptable[@]} ]; then
printf "\n The following tables are missing from DROP tables:\n\n"
for i in "${droptable[@]}"; do
found=0
for j in "${dropnames[@]}"; do
[ $i = $j ] && found=1 && continue
done
[ $found -eq 0 ] && printf " %s\n" "$i"
done
fi
printf "\n"
exit 0