У меня есть файл, который содержит список имен с указанием года их предоставления. Я хотел бы выяснить, как часто каждая буква встречается в каждом имени, но я не знаю, как это сделать. Формат файла:

"Given name","Year","Gender"  
"Given name","Year","Gender"

Где "Имя" - это строка, "Год" - это четырехзначное представление номера года, а "Пол" - 1 или 2.

Годы варьируются от 1917 до 2017 года, и насчитывается около 6,5 миллионов уникальных имен, но вычислительная мощность не является проблемой. У меня есть файл, разбивающий имена по слогам, и файл, в котором они рассматриваются как целые имена. Я хотел бы запустить поиск, который возвращает экземпляры каждой данной буквы в абзаце «Имя» для каждого значения года, например, так:

1029000, a, 1917
5140, b, 1917
67043, c, 1917

И повторять каждый год. Я думаю, я мог бы сделать это вручную с помощью grep, но для каждой буквы и года потребовалось бы целую вечность (из-за различных иностранных букв в сумме получается около 50 уникальных знаков, и у меня есть данные за 100 лет, так что в целом из 5000 пробегов было бы необходимо). Может ли кто-нибудь помочь мне с простым сценарием, который позволит мне выполнить это, не ломая голову бездумным повторением?

1 ответ1

0

Вот способ сделать работу с помощью Perl-скрипта:

#!/usr/bin/perl
use Data::Dump qw(dump);

my %result;
# open iput file
my $in_file = 'file.txt';   # give the fullpath to the file
open my $fh, '<', $in_file or die "unable to open '$in_file': $!";
# read the file line by line
while(my $line = <$fh>) {
    # extract name and year from current line
    my ($name, $year) = $line =~  /"([^"]+)","(\d+)/;
    # Explode the name into letters
    my @letters = split //, $name;
    # increment result for each letter, for current year
    $result{$year}{$_}++ for @letters;
}

dump%result;

Пример входного файла:

"Given name","2000","Gender"  
"another name","2001","Gender"

Выход:

(
  2000,
  { " " => 1, "a" => 1, "e" => 2, "G" => 1, "i" => 1, "m" => 1, "n" => 2, "v" => 1 },
  2001,
  { " " => 1, "a" => 2, "e" => 2, "h" => 1, "m" => 1, "n" => 2, "o" => 1, "r" => 1, "t" => 1 },
)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .