如何将第二个单词添加为文件中每一行的数字?

How to add second word as a number of each line in a file?

我正在努力把所有的钱都加起来

$ cat samplemoney.txt
Company1 100
Company2 200
Company3 100
Company4 300
Company5 200

以下是shell脚本

#!/bin/sh
sum=0;
while read l;
do
IFS=' ' read -r -a array<<< "$l"
a=${array[1]}
sum=`expr $sum+$a`
done<samplemoney.txt
echo $sum

输出获取:

0+100+200+100+300

需要输出:

900

注意 - 在 Windows

上使用 Git Bash

您有一个小错字:在“expr $sum+$a”和您的代码 'works':

中添加空格
cat sample_money.txt
Company1 100
Company2 200
Company3 100
Company4 300
Company5 200

cat add_script.sh
#!/bin/sh
sum=0;
while read l
do
  IFS=' ' read -r -a array <<< "$l"
  a=${array[1]}
  sum=`expr $sum + $a`
done < sample_money.txt
echo $sum

./add_script.sh
900

话虽如此,您有许多问题需要解决,例如无需使用数组,outdated/antiquated 语法;考虑使用诸如 shellcheck.net 之类的 linter 来改进您的代码。

while可以直接从文件中读取(即不需要数组),eg:

sum=0

while read -r company amount
do
    (( sum+=amount ))
done < samplemoney.txt

echo "${sum}"

备注:

    只要您处理整数,
  • sum+=amount 就可以工作;如果你发现你需要使用 reals/floats 那么从 bash 的角度来看它会变得有点复杂(尽管 William Pursell 的 awk 解决方案应该适用于整数和 reals/floats)
  • (( sum+=amount )) 需要 bash(例如,#!/bin/bash);虽然 OP 的代码显示 #!/bin/sh(我假设是 bourne shell),但问题也被标记为 bash(我认为这意味着 OP 也可以访问 bash

这会生成:

900

OP 在 windows 的 git/bash 中 运行 遇到问题,出现错误:

")syntax error: invalid arithmetic operator (error token is "

这似乎是数据文件中 Windows 行结尾 (\r) 的问题。

OP 有几个选项:

  • 运行 dos2unix samplemoney.txt(删除 \r)在 运行 进入 while 循环之前或...
  • while read -r 替换为 while IFS=$IFS$'\r' read -r(根据 Gordon Davisson 的评论)或 ...
  • done < samplemoney.txt替换为done < <(tr -d '\r' < samplemoney.txt)

这对于 awk 来说几乎是微不足道的:

$ cat money.txt 
Company1 100
Company2 200
Company3 100
Company4 300
Company5 200
$ awk '{s += } END {print s}' money.txt 
900