大家。所以我在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很容易地做到这一点,但我很缺乏经验,所以我无法通过这件事来解决问题。救命
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'
我相信你一年中总计第一场的长度。如果那么下面是awk
awk -F, '{a[$2]+=length($1)-2} END{for(i in a) print i,a[i]}' file