Script Unix para contar o número de ocorrências de uma string em linhas com outra string

0

Eu tenho um arquivo que contém uma lista de nomes completa com seu ano de doação. Eu gostaria de descobrir quantas vezes cada letra ocorre em cada nome, mas estou meio que sem saber como fazer isso. O formato do arquivo é:

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

Onde "Nome próprio" é uma cadeia, "Ano" é a apresentação em quatro dígitos do número do ano e "Sexo" é 1 ou 2.

Os anos variam de 1917 a 2017 e existem cerca de 6,5 milhões de nomes únicos, mas o poder de processamento não é um problema. Eu tenho um arquivo dividindo os nomes dados para sílabas e um onde eles são tratados como nomes inteiros. Gostaria de executar uma pesquisa que retorne instâncias de cada letra fornecida no parágrafo Nome dado para cada valor de ano, de modo que, por exemplo, seja:

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

E repita para cada ano. Eu poderia fazer isso manualmente com o grep, eu acho, mas levaria uma eternidade para executá-lo para cada letra e ano (devido a várias letras estrangeiras, há aproximadamente 50 sinais únicos no total, e eu tenho 100 anos de dados para um total de 5000 corridas seria necessário). Alguém poderia me ajudar com um roteiro simples que me permitiria realizar isso sem quebrar a cabeça com repetição irracional?

    
por Jarno Porkka 23.01.2018 / 13:33

1 resposta

0

Aqui está uma maneira de fazer o trabalho com um script 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;

Arquivo de entrada de amostra:

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

Saída:

(
  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 },
)
    
por 23.01.2018 / 14:01