所以我有一个包含一些文本的文件,但有些行只包含“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.任何想法?谢谢!
答案 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)
awk
和bash
是两个独立的程序;他们不共享变量。您只需要一个awk
脚本:
awk -F '>' '$1 == "Overall" {reviews += $2}; END {print reviews}' "$file"