perl添加文件列的内容
基本上我有一个如上所示的文件,并希望添加B列的内容,即8+60+10+60。坦率地说,我不确定是否需要删除第一行文本,以及是否可以使用split函数并将其放入散列中perl添加文件列的内容,perl,add,Perl,Add,基本上我有一个如上所示的文件,并希望添加B列的内容,即8+60+10+60。坦率地说,我不确定是否需要删除第一行文本,以及是否可以使用split函数并将其放入散列中 Column A | Column B | Column C | Column D 35627799100 8 8 2 35627788000 60 34
Column A | Column B | Column C | Column D
35627799100 8 8 2
35627788000 60 34 45
35627799200 10 21 21
35627780000 60 5 8
my%hash=map{split/\s+/,$\u4};
提前谢谢你的帮助 如果您只想对第二列求和,则散列是多余的。你可以这样做,直接在地图上计算总和
my %hash = map {split/\s+/,$_,4} <$file>;
如果第1列可能没有文本(即,该行以一个空格开始,第一个非空格代表第二列),则将模式的第一部分从
^\s+
更改为^\s*
,这是一个基于数据的示例:
my $sum = 0;
while (<STDIN>)
{
$sum += $1 if $_ =~ /^\S+\s+(\d+)/;
}
使用严格;
使用警告;
我的$sum\u列\u b=0;
; #落差收割台
while(我的$line=){
$line=~m/\s+(\d+/;#regexpr以捕获第二列值
$sum_column_b+=1美元;
}
打印$sum\u列\u b,“\n”#<代码>$sum+=(拆分“”,$\u3)[1]虽然首选
:它不将整个文件读入内存,但它访问正确的列(数组索引是从零开始的),并通过将生成的片段数量限制为三个,避免拆分过多。顺便说一句,在void上下文中,map
只意味着你想要一个for
,而文件句柄上的循环通常应该使用迭代器while
。或者$sum+=(split)[1]而为了简短起见,你知道吗,我输入了一个错误。我的意思是[1]
,而不是[2]
,甚至在我离线的测试脚本中也有。我将编辑以上内容以修复它。但是对于map
和while
,map
应该和while
一样懒惰,不是吗?编辑:我刚刚尝试过,在$sum+=
前面添加say
,并且map
在处理之前会发出整个文件的声音。我将在
时将上述内容更改为使用。我尝试了一下,但出现了一个错误:参数“number”不是数字加法(+),位于./bss_license.pl第7行,第1行。#/usr/bin/perl使用严格;使用警告;我的$sum;打开我的$file,“如果您的输入文件有标题行或类似的行,那么您必须添加额外的逻辑来跳过这些行。例如,在循环中更改为regexp:while(){$sum+=$1 If$\u=~/^\ S+\S+(\d+)/;}
您能解释一下$line=~m/\S+(\d+)是如何操作的吗?”/;正在捕获第二列吗?$sum_column_b+=$1行中的任何列;为什么使用$1?感谢第一列左侧没有空格。因此regexpr的第一个匹配项是列b:1或更多空格\s+,位于数字(\d+)之前。我用括号将其记为$1。在regexp的开头显式声明^\S+
以仅匹配具有该属性的行,并将总和放入if
语句的主体中,这样您就可以显式跳过标题行。在这种情况下,这可能没有多大关系(空字符串充当零),但对我来说,直言不讳更安全。
my $sum = 0;
while (<STDIN>)
{
$sum += $1 if $_ =~ /^\S+\s+(\d+)/;
}
use strict;
use warnings;
my $sum_column_b = 0;
<DATA>; #drop header
while( my $line = <DATA>) {
$line =~ m/\s+(\d+)/; #regexpr to catch second column values
$sum_column_b += $1;
}
print $sum_column_b, "\n"; #<-- prints: 138
__DATA__
Column A | Column B | Column C | Column D
35627799100 8 8 2
35627788000 60 34 45
35627799200 10 21 21
35627780000 60 5 8