сценарий оболочки объединить два списка и удалить дубликаты - PullRequest
1 голос
/ 22 июня 2010

У меня есть следующий код:

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 сами по себе считаются различными. Если x в a и y в b существуют так, что x.name = y.name, тогда я хочу сохранить только x. как мне это сделать?

1 Ответ

2 голосов
/ 26 июня 2010

Вы хотите, чтобы все записи из list_A были дополнены всеми записями из list_B для которого в списке А. уже нет подходящего имени. Математически это:

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

Есть много способов сделать это, в зависимости от доступа и необходимой эффективности.

  • Если вы можете изменить DB1 (с помощью A), затем загрузить таблицу B из DB2, загрузить ее в 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

Это решение, конечно, предполагает, что вам разрешено изменять порядок записей, как это делается на шаге sort .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...