2010-06-22 101 views
1

我有以下代码:shell脚本,合并两个列表并删除重复

 
get_list_a() 
{ 
    $MYSQL -B -u $USER --passwword="$PW" $DB <<EOF 
select name, value from mytable_a 
EOF 
} 
get_list_b() 
{ 
    $MYSQL -B -u $USER --passwword="$PW" $DB <<EOF 
select name, value from mytable_b 
EOF 
} 

get_list_a >$test.txt 


现在我需要结合A和B的第一,并删除所有的DUP(关键是名字,第一列),然后把它们写到test.txt。列表a和列表b本身被认为是不同的。如果b中的a和y存在x,使得x.name = y.name,那么我只想保留x。 我该怎么做?

+1

这是一个非常糟糕的做法,编程两个往返数据库的查询可以通过一个答案。 SQL非常擅长您想要执行的数据操作,而且shell非常糟糕。如果可能的话,尝试在数据库中完成工作,而不是在数据库之外;双方会更快乐。 – 2010-06-22 07:10:30

+0

不,它们来自两个数据库,不能合并。 – user121196 2010-06-22 17:07:10

回答

1

你想从list_A从list_B所有记录 补充所有记录其中有尚未名单A.匹配名称数学上,这就是:

A + B - {w in B | (w,value) in A } 

实现这一点有很多方法取决于访问和需要的效率。

  • 如果你可以修改DB1(含A),然后下载从DB2表B,把它上传到DB1,然后用合适的提取您的数据加入
  • 如果您不能修改DB1,然后同时下载A和B并将它们连接到同一个流,A和B之后按第一个字段排序。然后在时间处理流一条记录。重复的名字将是并排的。如果同一名称出现多次,请打印第一个并忽略具有相同名称的后续记录。

下面是一个简单的解决您的问题(与名称/值的两个列表开始):

#!/bin/bash 

A="Smith value1 
Jones value2 
Wilson value3" 

B="Smith value10 
Wilson value11 
Fox value12 
Brown value13" 

PrevName="Not a valid name" 
echo "$A 
$B" | sort -k1 | 
while read Name Value 
do 
    if [ "$Name" != "$PrevName" ]; then 
     echo $Name $Value 
    fi 
    PrevName="$Name" 
done > outfile 

这里是输出:

Brown value13 
Fox value12 
Jones value2 
Smith value1 
Wilson value11 

该解决方案,当然,假定您可以更改记录的顺序,如步骤中所做的那样。