我有两个SQL文件A.SQL和B.SQL。我的要求是比较A.SQL和B.SQL,我需要检查A.SQL中存在的查询是否存在于B.SQL中,如果它不在B.sql中,那么我们需要打印A.sql中有而B.sql中没有的内容。所以基本上,我将sql查询存储到分号作为一个查询,并比较两个数组并打印内容。
以下是示例
A.sql
Select * from emp;
Select * from dept;
Select * from student;
Select * from subject;
B.sql
Select * from emp;
Select * from dept;
Select * from student;
输出除外
Select * from subject;
输出我得到的
Select * from emp;
下面是我的脚本
i=0
while read -rd ';' first_sql
do
first_array[$i]=$first_sql
i=$((i+1))
done < A.sql
j=0
while read -rd ';'second_sql
do
second_array[$j]=$second_sql
j=$((j+1))
done < B.sql
for p in "${first_array[@]}"; do
flag=false
for q in "${second_array[@]}"; do
if [[ $p == $q ]]; then
echo "$p is in first_array"
flag=true
break
fi
done
echo $flag
echo "$p is not in first_array"
done
所以现在我正在读取第一个SQL文件,即A.SQL到分号作为一个查询,并将其存储到数组中。
i=0
while read -rd ';' first_sql
do
first_array[$i]=$first_sql
i=$((i+1))
done < A.sql
所以现在我正在读取第二个SQL文件,即B.SQL到分号作为一个查询,并将其存储到数组中。
j=0
while read -rd ';'second_sql
do
second_array[$j]=$second_sql
j=$((j+1))
done < B.sql
现在我比较first_array和second_array,并在内部for循环之外打印first_arrays中存在和second_aarray中不存在的内容。
for p in "${first_array[@]}"; do
flag=false
for q in "${second_array[@]}"; do
if [[ $p == $q ]]; then
echo "$p is in first_array"
flag=true
break
fi
done
echo $flag
echo "$p is not in first_array"
done
有人能帮我解决上面的问题吗?让我知道出了什么问题。
注意:我的一个SQL查询不占用单行,它将超过4-5行。举个例子,我使用了一个单行查询
由于我的一个SQL查询有4-5行以上,所以我在while循环中读取SQL查询并将其存储在一个数组中,然后比较这两个数组以打印不匹配的内容
提前感谢!!!
您可以使用一个使用comm
只打印出第一个文件中出现的语句的单行,并进行一些预处理和后处理以说明多行sql语句:
$ comm -z -23 <(perl -0777 -pe 's/;n/;x{0}/g' a.sql | sort -z)
<(perl -0777 -pe 's/;n/;x{0}/g' b.sql | sort -z)
| tr "