我如何从列中读取数字并将它们加在一起

我如何从列中读取数字并将它们加在一起

我希望能够在命令行中的数据和 bss 部分下添加文件大小信息中的数字

./script.sh [file name]

到目前为止,我将 Shell 脚本编写为:

ExcPath=$1 #read file name from command line
Numberone= size $1 | $data #put data column into Numberone
Numbertwo= size $1 | $bss #put bss column into Numbertwo
sum=$(( $Numberone + $Numbertwo )) # calculate the sum of DATA and BSS
echo $sum 

$data$bss是我认为 shell 如何从“data”和“bss”列读取的变量

输出size test

text   data    bss    dec    hexfile name
2231    600      8   2839      b17   test

运行我的脚本后的预期输出:

608

我怎样才能在 Shell 脚本中实现这一点?我做错了什么?

答案1

恐怕你的剧本完全错误。请花时间阅读一些有关 shell 脚本编写的基本教程,以便您了解需要做什么。请注意,您实际上需要文件,而不仅仅是将其放入变量中。

处理此类事情最常用的工具是awk.和awk你一起可以做:

$ awk 'NR>1{print $2+$3}' file
608

NR是当前行号,$N是当前行的第N个字段。因此该命令告诉awk我们跳过第一行 ( NR>1),然后打印第二个和第三个字段的总和。


贝壳是一个可怕的工具用于解析文件,但如果您绝对必须在 shell 中执行此操作,您可以尝试:

#/bin/bash

ExcPath=$1

## Now, skip the first line and read the rest
tail -n+2 "$ExcPath" |
  ## split on whitespace and save in the variables 
  while read text data bss dec hexfile name; do
    echo $(( $data + $bss))
  done

将其另存为script.sh,然后./script.sh filename像您所做的那样运行:

$ ./script.sh file
608

答案2

命令

z=0;for l in `awk '{for(i=1;i<=NF;i++){if($i ~ /data|bss/){print i}}}' filename`; do m=`awk -v l="$l" 'BEGIN{sum=0}{sum=sum+$l}END{print sum}' p`;z=$(($z+$m)); done;echo $z

输出

608

相关内容