Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: сцепить два файла по общему полю  (Прочитано 799 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн vasilisc

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 2563
  • г.Северодвинск - строим АПЛ
    • Просмотр профиля
    • Авторские статьи об OpenSource
сцепить два файла по общему полю
« : 22 Августа 2011, 13:07:58 »
Помогите плиз решить задачку на языках доступных в Ubuntu
есть два файла
первый файл
аккаунт:ФИО
ivanoff:Ivanoff II
второй файл
емайл:аккаунт
ivanoff@firma.ru:ivanoff
нужно сцепить инфу из обоих файлов, чтобы в третьем файле была инфа из первых двух, но в одном месте.
порядок полей не важен и возможен повтор полей
емайл:аккаунт:ФИО
ivanoff@firma.ru:ivanoff:Ivanoff II

просто влом всё закачивать в SQL и там джойнить
охота решить такую задачку проще - так как часто требуется ... время не жмёт =)
всем спасибо за сломанную голову
(Нажмите, чтобы показать/скрыть)

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: сцепить два файла по общему полю
« Ответ #1 : 22 Августа 2011, 15:03:37 »
что-то типа?
#!/usr/bin/perl

use strict;

my %joined_data = ();

open F_IN1, $ARGV[0] || die "can't open file \"".$ARGV[0]."\"\n";
foreach my $line (<F_IN1>) {
    chomp $line;
    next if $line eq "";
    my ($acc, $name) = split(/\:/, $line);
    if (defined $acc) {
if (not defined $joined_data{$acc}) {
    $joined_data{$acc} = {};
}
$joined_data{$acc}->{name} = $name;
    }
}
close F_IN1;

open F_IN2, $ARGV[1] || die "can't open file \"".$ARGV[1]."\"\n";
foreach my $line (<F_IN2>) {
    chomp $line;
    next if $line eq "";
    my ($email, $acc) = split(/\:/, $line);
    if (defined $acc) {
if (not defined $joined_data{$acc}) {
    $joined_data{$acc} = {};
}
$joined_data{$acc}->{email} = $email;
    }
}
close F_IN2;

foreach my $acc (keys %joined_data) {
    print $joined_data{$acc}->{email}, ":", $acc, ":", $joined_data{$acc}->{name}, "\n";
}
идея понятна. нужные поля сможешь добавить.
объём обрабатываемых данных ограничен размерами ОЗУ так что аккуратнее.

andrey_p

  • Гость
Re: сцепить два файла по общему полю
« Ответ #2 : 22 Августа 2011, 15:56:58 »
Попробуй:
join -t: -12 -21  <(tail -n+2 FILE2 | sort) <(tail -n+2 FILE1|sort)Если есть несовпадающие строки, то надо добавить -е'строка замещающая отсутсвующее поле' к join.

Оффлайн vasilisc

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 2563
  • г.Северодвинск - строим АПЛ
    • Просмотр профиля
    • Авторские статьи об OpenSource
Re: сцепить два файла по общему полю
« Ответ #3 : 22 Августа 2011, 16:23:23 »
Попробуй:
join -t: -12 -21  <(tail -n+2 FILE2 | sort) <(tail -n+2 FILE1|sort)Если есть несовпадающие строки, то надо добавить -е'строка замещающая отсутсвующее поле' к join.
спасибо огромное
стыдно, что не поискал man -k join и не нашёл сам
век - живи, век - учись
спасибо

 

Страница сгенерирована за 0.016 секунд. Запросов: 22.