如何编写一个脚本来对文件中的数字求和?

如何编写一个脚本来对文件中的数字求和?

我想对纯文本文件中的数字求和。我可以用命令或 bash 脚本来做这件事吗?

假设我想按照如下模式提取数字:

… text text …
Removed 50 items out of 50 items.
… text text …
Removed 34 items out of 50 items.
… text text …

因此,在上述情况下,我想提取弹出行中的第一个数字并将其相加。在示例中,结果应为 84。我知道如何 grep 它,但这就是我对 *nix 命令的了解程度。

答案1

尝试

  grep Removed filename | awk '{sum += $2} END { print "sum=", sum }'

或者

 awk '/Removed/ { sum += $2 } END { print "sum=", sum }' filename

答案2

使用 perl 你可以这样写:

perl -a -n -e '$sum += $F[1] if $F[0] eq "Removed"; END { print $sum }'  filename(s)

其中 -a 表示按空格自动分割到 @F 数组中,$F[0] 是单词 Removed 所在的第一个元素,$F[1] 是第二个元素。

-n 表示逐行检查命令行中给出的文件

-e 表示将下一个字符串作为脚本(而不是文件)

如果您在本机 Windows 上运行(我从提到 Cygwin 的评论中看到),那么您可以使用“Padre on Strawberry”包完成所有这些操作,尽管由于不同的 shell,您需要切换 ' 和 " 字符。

答案3

有时我想对文件中出现的多个列求和。此脚本对“看起来像数字”的列求和

#!/usr/bin/perl -w
#
# csum
#
# Sum up numerical fields in a text file
#

my $i;
my @sum;

while (<>)
{
    print;
    my @F = split;
    for $i (0..$#F)
    {
        if ($F[$i] =~ /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/)
        {
            $sum[$i] += $F[$i];
        }
    }
}

print "-" x 75 . "\n";
print join "\t", map {$_ or ""} @sum;
print "\n";

答案4

if [ $# -ne 1 ]
then
    echo "Usage: $0   number"
    echo "       I will find sum of all digit for given number"
    echo "       For eg. $0 123, I will print 6 as sum of all digit (1+2+3)"
    exit 1
fi

n=$1
sum=0
sd=0
while [ $n -gt 0 ]
do
    sd=`expr $n % 10`
    sum=`expr $sum + $sd`
    n=`expr $n / 10`
done
    echo  "Sum of digit for numner is $sum"

相关内容