Bash:将列的内容添加到变量中

时间:2018-02-23 22:17:53

标签: bash variables awk

所以我有一个包含一些文本的文件,但有些行只包含“Overall> 5”。 (>之后的数字可以是0到5之间的任何数字。)

我写的代码:

let sumOfReviews=0

while read line; do awk -F ">" '{if($1=="Overall") ((sumOfReviews+=$2))}'; done<$file

echo $sumOfReviews

我尝试将这些行拆分为“&gt;”中的2列我想将第二列中的数字(本例中为5)添加到变量中。问题是当我打印出变量的值时,结果显示为0.任何想法?谢谢!

3 个答案:

答案 0 :(得分:1)

如果从控制台调用,以下似乎可以完成这项工作:

awk -F'>' '/Overall>[0-9]+/ { total += $2 } END { print total }' exampleData.txt

如果您想从bash内部进行调用,则必须将其封在$( ... )中:

#!/bin/bash

total="$(awk -F'>' '/Overall>[0-9]+/ { total += $2 } END { print total }' exampleData.txt)"

# do something with `total` here.

您不能简单地使用awk作为bash内的某种语法,awk是一种单独的编程语言,它作为一个完全独立的进程调用。您可以尝试在awk的源代码中构建一些bash参数。

答案 1 :(得分:1)

这可以在一行awk脚本中完成。

awk 'BEGIN { FS=">"; sumOfReviews=0 } /^Overall>[0-5]/ { sumOfReviews+=$2 } END { print sumOfReviews }' < file

Manpage的说明:

AWK程序由一系列模式动作语句和可选的函数定义组成。

pattern   { action statements }

在这种情况下,我们使用 BEGIN 模式将文件分隔符设置为“&gt;” sumOfReviews变量为0。

我们使用 / ^整体&gt; [0-5] / 正则表达式模式来匹配以“Overall&gt;”开头的行后跟一个数字0-5,如果为true,则将$ 2字段添加到sumOfReviews变量。

最后,我们使用 END 模式输出最终的sumOfReviews值。

bash shell脚本中的示例解决方案:

#!/bin/bash

noAuthors=4 # set to 4 for example

sumOfReviews=$(awk 'BEGIN { FS=">"; sumOfReviews=0 } /^Overall>[0-5]/ 
{ sumOfReviews+=$2 } END { print sumOfReviews }' < file)

echo $(($sumOfReviews/$noAuthors))

答案 2 :(得分:0)

awkbash是两个独立的程序;他们不共享变量。您只需要一个awk脚本:

awk -F '>' '$1 == "Overall" {reviews += $2}; END {print reviews}' "$file"