shell脚本合并两个列表并删除重复项

时间:2010-06-22 06:04:34

标签: shell scripting

我有以下代码:

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并删除所有重复项(键是名称,第一列),然后将它们写入test.txt。列表a和列表b本身被假定为不同的。如果b中a和y中的x存在,使得x.name = y.name,那么我只想保留x。 我该怎么做?

1 个答案:

答案 0 :(得分:2)

您希望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

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