Unix 脚本用于计算某个字符串与另一个字符串在同一行出现的次数

Unix 脚本用于计算某个字符串与另一个字符串在同一行出现的次数

我有一个文件,其中包含姓名列表以及捐赠年份。我想找出每个字母在每个姓名中出现的频率,但我不知道该怎么做。文件格式为:

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

其中“名字”是字符串,“年份”是 4 位数字表示的年份,“性别”是 1 或 2。

年份范围从 1917 年到 2017 年,有大约 650 万个唯一名称,但处理能力不是问题。我有一个文件将名字拆分为音节,还有一个文件将它们视为整个名称。我想运行一个搜索,返回每个年份值的名字段落中每个给定字母的实例,例如:

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

并针对每年重复此操作。我想我可以用 grep 手动执行此操作,但针对每个字母和年份运行此操作会花费很长时间(由于各种外文字母,总共有大约 50 个唯一符号,并且我有 100 年的数据,因此总共需要运行 5000 次)。有人能帮我编写一个简单的脚本,让我可以完成此操作而不必因无意识的重复而伤脑筋吗?

答案1

以下是使用 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 },
)

相关内容