我想对纯文本文件中的数字求和。我可以用命令或 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"