2010-06-22 99 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 

該解決方案,當然,假定您可以更改記錄的順序,如步驟中所做的那樣。