слияние сценария оболочки два перечисляет и удаляет дубликаты

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

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
задан user121196 22 June 2010 в 06:04
поделиться

1 ответ

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

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 .

2
ответ дан 2 September 2019 в 23:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: