如何在Shell脚本中比较两个数组



我有两个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 "" "n"
Select * from subject;

(这确实假设了GNU用户区;commsort的其他版本可能不采用-z选项(。

相关内容

  • 没有找到相关文章

最新更新