shell 如何从文件中使用bash仅对几行求和

fjaof16o  于 2023-05-01  发布在  Shell
关注(0)|答案(5)|浏览(168)

如何使用bash对文件中的几行进行求和
我的档案

10
20
30
40

我只需要添加10+30使用bash和输出到一个变量我有代码,但其冗长,不好看
我的代码

a=$(sed -n '1p' file1)
b=$(sed -n '3p' file1)
total=`expr $a + $b`
echo $total

有更好的办法吗

ma8fv8wu

ma8fv8wu1#

Bash提供了mapfile(与readarray同义),它将myfile.txt的行读入索引数组。然后简单地对所需的元素求和,可以手动提供索引,也可以在循环中,例如对奇数或偶数值求和。在您的情况下,您可以执行以下操作:

mapfile -t arr < myfile.txt
sum=$((${arr[0]}+${arr[2]}))
echo $sum

使用/输出

如果您的数据在myfile.txt中,您将拥有:

$ mapfile -t arr < myfile.txt; sum=$((${arr[0]}+${arr[2]})); echo $sum
40
zwghvu4y

zwghvu4y2#

对于awkPOSIX),让我们**KISS**:

awk 'NR==1{a=$1} NR==3{b=$1;exit}END{print a + b}' file1
40

bash

read a b < <(sed -n '1p;3p' file1 | paste -sd' ' -)
echo $((a + b))
40

((...))$((...))是算术命令,如果表达式为非零,则返回退出状态0,如果表达式为零,则返回退出状态1。如果需要副作用(赋值),也用作“let”的同义词。
参见http://mywiki.wooledge.org/ArithmeticExpression
进程替换>(command ...)<(...)被临时文件名替换。写入或阅读该文件会导致字节通过管道传输到内部的命令。通常与文件重定向结合使用:cmd1 2> >(cmd2)。参见http://mywiki.wooledge.org/ProcessSubstitutionhttp://mywiki.wooledge.org/BashFAQ/024

xqkwcwgp

xqkwcwgp3#

不知道你说的“更好”是什么意思。但“不同”如下:
对于奇数行值之和:
awk 'BEGIN{t=0}{if (NR%2 == 1) t+=$1;}END{print t}' file1
对于偶数行:
awk 'BEGIN{t=0}{if (NR%2 == 0) t+=$1;}END{print t}' file1
对于特定行(e.g 1、4、6):
awk 'BEGIN{t=0}{if (NR == 1 || NR == 4 || NR == 6) t+=$1;}END{print t}' file1

gev0vcfq

gev0vcfq4#

$ awk 'NR==1{x=$0} NR==3{print x+$0; exit}' file
40

为了提高效率,该脚本在读取第二个目标行时退出,而不是继续读取其余的输入。

643ylb08

643ylb085#

使用sedbc的替代方法:

sed 'N;N;s/\n.*\n/+/;q' file | bc

相关问题