如何将第二个单词添加为文件中每一行的数字?
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
我正在努力把所有的钱都加起来
$ 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