我需要计算文件中第一个字段中的符号数,并将其与另一个字段相加

问题描述 投票:-1回答:2

大家。所以我在Linux环境中使用.csv文件,事情大多按计划进行。该文件包含名称和给出的年份以及分配给他们的性别,例如:

"Pasi","1917","1"  
"Juha","1918","1"  
"Katri","1918","2"  
"Senna","1948","2"  
etc.  

出于此任务的目的,表示性别的数字无关紧要。我需要按年计算名字中的总字符数。我想我可以很容易地cut -d " -f 2 | awk '{ print length($0); }'然后粘贴剩下的段落,因为行数保持不变。问题仍然是我需要获得一年的总和,我似乎无法弄清楚如何在Bash中轻松完成。

我正在一个我有限访问权限的系统上运行,所以如果我只用Bash命令就能做到这一点就不那么麻烦了。感觉我应该能够用Awk或Perl很容易地做到这一点,但我很缺乏经验,所以我无法通过这件事来解决问题。救命

linux bash
2个回答
0
投票

Perl中问题的解决方案:

#!/usr/bin/perl
use strict;
use warnings;

# get the data file as a command line argument
my $csv_file = shift;

open my $fh, $csv_file or die "Can't open $csv_file: $!";

# a hash to hold total names length per year
my %total_len;

while (<$fh>) {
    my ( $name, $year, $gender ) = split ",";

    # remove quotes
    $name =~ s/"//g;
    $year =~ s/"//g;

    $total_len{$year} += length $name;
}

# generate report sorted by year    
for my $year ( sort keys %total_len ) {
    print join( "\t", $year, $total_len{$year} ), "\n";
}

将上面的代码保存在名为names_length的文件中,将数据保存在data.csv中并运行它:

$ perl names_length data.csv 
1917    4
1918    9
1948    5

如果你喜欢单行:

cat data.csv | perl -pe 's/"//g' | perl -MData::Dumper -F"," -lane '$total{@F[1]} += length @F[0] }{ print Dumper \%total'

1
投票

我相信你一年中总计第一场的长度。如果那么下面是awk

awk -F, '{a[$2]+=length($1)-2} END{for(i in a) print i,a[i]}' file
© www.soinside.com 2019 - 2024. All rights reserved.