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

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

get_list_a()
{
    $MYSQL -B -u $USER --passwword="$PW" $DB1 <<EOF
select name, value from mytable_a
EOF
}
get_list_b()
{
    $MYSQL -B -u $USER --passwword="$PW" $DB2 <<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.как мне это сделать?примечание: объединение в SQL не является вариантом, поскольку они находятся в разных БД с разным сопоставлением.

Пример:
get_list_a печатает

aaa bbb
ccc ddd

get_list_b печатает

aaa fff
ggg hhh

Я хочу, чтобы в файл было записано следующее:

aaa bbb
ccc ddd
ggg hhh

Ответы [ 4 ]

1 голос
/ 27 июня 2010

Просто для «развлечения», вот решение с использованием sed и без временных файлов (только переменные):

x=$(get_list_a) 
y=$(get_list_b)

while read name value
do 
    y=$(echo "$y" | sed "/^$name/ d")
done << EOF
$x
EOF

echo "$x"
echo "$y"
1 голос
/ 22 июня 2010

Будет ли работать SQL-запрос по этим направлениям?(Не проверено)

SELECT COALESCE(x.name,y.name),COALESCE(x.value,y.value)
FROM mytable_a AS x
FULL JOIN mytable_b AS y
ON x.name = y.name;

Редактировать: ОК, если они находятся в отдельных БД и поля разделены пробелами, как вы указали в комментарии, я бы, вероятно, использовал ассоциативные массивы в perl или awk, позволяязначения из x (a) перезаписывают значения из y (b).Примерно так (пока не проверено):

get_list_a > x.txt
get_list_b > y.txt
cat y.txt x.txt | awk '{ data[$1] = $2; } END { for (i in data) { print i, data[i]; }}'
0 голосов
/ 22 июня 2010

Вы удаляете дубликаты только на дубликатах ключей или значениях?

Команда sort -u удаляет дубликаты (буква u для «уникальный»).У этого есть варианты для значения ключа сортировки, выраженного в начальном и конечном столбцах characeter.Это может быть так просто: (при условии фиксированной длины значений или фиксированного форматирования столбца):

get_list_a >$test.txt
get_list_b >>$test.txt
sort -u test.txt -k<startcol>,<endcol> test.txt > output.txt

Конечно, я бы предпочел выполнить слияние в SQL.

0 голосов
/ 22 июня 2010

Можете ли вы сформулировать свой вопрос немного яснее?Можете ли вы привести краткий пример ввода и пример вывода, которые вы ожидаете?Немного неясно, что именно вы спрашиваете.

Редактировать: Учитывая, что вы хотите, это должно сработать:

get_a  > inputfile
get_b >> inputfile
perl -lne '$data{$F[0]} = $F[1] unless exists $data{$F[0]} }{ for $key (keys %data) { print "$key $data{$key}\n"}' inputfile > outputfile

}{ потому что звонит perl -n заставляет программу (заданную -e) быть обернутой в неявный блок while (<STDIN>) { ... }.} закрывает while, а { открывает новый кодовый блок, который запускается до неявного }

Вызов perl с -l вызывает автоматическое разбиение входа на @F, аналогично тому, как в awk есть $1, $2 и т. д. Затем вы добавляете пару ключ / значение в %data, если ключ уже не существует.

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