如何使用bash对文件中的几行进行求和我的档案
10 20 30 40
我只需要添加10+30使用bash和输出到一个变量我有代码,但其冗长,不好看我的代码
a=$(sed -n '1p' file1) b=$(sed -n '3p' file1) total=`expr $a + $b` echo $total
有更好的办法吗
ma8fv8wu1#
Bash提供了mapfile(与readarray同义),它将myfile.txt的行读入索引数组。然后简单地对所需的元素求和,可以手动提供索引,也可以在循环中,例如对奇数或偶数值求和。在您的情况下,您可以执行以下操作:
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
zwghvu4y2#
对于awk(POSIX),让我们**KISS**::
POSIX
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
((...))
$((...))
>(command ...)
<(...)
cmd1 2> >(cmd2)
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
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
awk 'BEGIN{t=0}{if (NR == 1 || NR == 4 || NR == 6) t+=$1;}END{print t}' file1
gev0vcfq4#
$ awk 'NR==1{x=$0} NR==3{print x+$0; exit}' file 40
为了提高效率,该脚本在读取第二个目标行时退出,而不是继续读取其余的输入。
643ylb085#
使用sed和bc的替代方法:
sed
bc
sed 'N;N;s/\n.*\n/+/;q' file | bc
5条答案
按热度按时间ma8fv8wu1#
Bash提供了
mapfile
(与readarray
同义),它将myfile.txt
的行读入索引数组。然后简单地对所需的元素求和,可以手动提供索引,也可以在循环中,例如对奇数或偶数值求和。在您的情况下,您可以执行以下操作:使用/输出
如果您的数据在
myfile.txt
中,您将拥有:zwghvu4y2#
对于awk(
POSIX
),让我们**KISS**::
bash:
((...))
和$((...))
是算术命令,如果表达式为非零,则返回退出状态0,如果表达式为零,则返回退出状态1。如果需要副作用(赋值),也用作“let”的同义词。参见http://mywiki.wooledge.org/ArithmeticExpression
进程替换
>(command ...)
或<(...)
被临时文件名替换。写入或阅读该文件会导致字节通过管道传输到内部的命令。通常与文件重定向结合使用:cmd1 2> >(cmd2)
。参见http://mywiki.wooledge.org/ProcessSubstitutionhttp://mywiki.wooledge.org/BashFAQ/024xqkwcwgp3#
不知道你说的“更好”是什么意思。但“不同”如下:
对于奇数行值之和:
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
gev0vcfq4#
为了提高效率,该脚本在读取第二个目标行时退出,而不是继续读取其余的输入。
643ylb085#
使用
sed
和bc
的替代方法: