Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux shell和列_Linux_Perl_Shell_Sum - Fatal编程技术网

Linux shell和列

Linux shell和列,linux,perl,shell,sum,Linux,Perl,Shell,Sum,如何(使用Linux shell)对列中的数字求和?如果可能的话,我不想使用像awk或perl这样的强大工具。我想要一些类似于giveMeNumber | sum的东西,因为您没有提供文件示例,我将展示简单的(第1列)方法,使用Unix的计算器bc并使用tr命令将换行符转换为“+”——最后一个数字后面的换行符将创建一个额外的“+”最后: $ cat a 1 2 3 $ cat a | tr "\012" "+" ; echo "0" 1+2+3+0 $ (cat a | tr "\012" "+

如何(使用Linux shell)对列中的数字求和?如果可能的话,我不想使用像awk或perl这样的强大工具。我想要一些类似于
giveMeNumber | sum

的东西,因为您没有提供文件示例,我将展示简单的(第1列)方法,使用Unix的计算器
bc
并使用
tr
命令将换行符转换为“+”——最后一个数字后面的换行符将创建一个额外的“+”最后:

$ cat a
1
2
3
$ cat a | tr "\012" "+" ; echo "0"
1+2+3+0
$ (cat a | tr "\012" "+" ; echo "0") |bc
6
但是,我不太清楚为什么需要避免使用Perl,因为作为一行程序很容易做到:

> perl5.8 -ae '{map {$sum+=$_} <>; print "$sum\n"}' a
6
>perl5.8-ae'{map{$sum+=$\};打印“$sum\n”}a
6.

好吧-如果您使用的是
bash
(这可能是Linux上最常用的shell,但实际上没有一个“Linux shell”:-)您可以执行以下操作:

#!/bin/bash
a=0
while read n; do
  a=$[a+n]
done
echo $a

这将是您的
sum
程序-尽管将其称为其他程序可能是个好主意,因为
sum
是计算校验和的标准实用程序。

为什么要避免awk?这非常简单,您可以通过将
$1
更改为
$2
$3
等轻松更改要求和的列

$ seq 10
1
2
3
4
5
6
7
8
9
10
$ seq 10 | awk '{sum += $1} END{print sum}'
55
假设
giveMeNumber
在第一列中每行生成一个数字,否则使用
cut
提取相应的列。
tr
命令将用加号替换换行符:

1
2
3
变成

1+2+3+

需要结尾处的
echo 0
,以防止结尾处的final+出现解析错误。所有这些都被输入到
bc
,它会看到一个算术表达式,可以有效地对数字求和并打印结果:

$ seq 10|(tr '\n' '+'; echo 0)|bc
55

您可以使用用于数据库的Alacon命令行实用程序来实现这一点。它与Node.js一起工作,因此您需要安装并打包:

要从stdin计算sum,可以使用以下命令:

> cat data.txt | node alacon "SELECT VALUE SUM([0]) FROM TXT()" 

除了Bash之外,您展示的方法还可以在POSIX shell中使用。已弃用
$[…]
构造,请改用
$(…)
。或者,在Bash中,做
((a+=n))
“我怎么能把钉子钉进一块木头?我不想用锤子。”你到底为什么要避免使用适合这项工作的工具?可能的欺骗:@William:不要用锤子杀死跳蚤sledgehammer@William:为什么你会认为询问者的环境与你的相同?有很多嵌入式平台不提供Perl或AWK,或者使用缺少所需功能的精简变体(la-BusyBox)。或者,他可能正在编写一个脚本,该脚本需要在多个主机/发行版上使用不同(且不兼容)的Perl/AWK安装运行。关键是,它确实发生了。我不认为你缺乏智慧/远见可以成为你粗鲁的借口。@William:你认为如果提问者的解释不能让你满意,嘲笑和嘲笑是可以的吗?我不能同意。你确定你不是在嘲笑他,想展示你自己的优越感吗?如果你真的想澄清他的理由,你可以礼貌一点,而不是粗鲁一点。
> cat data.txt | node alacon "SELECT VALUE SUM([0]) FROM TXT()"