使用bash从文件中读取数据并使用awk获取某些列的总和

使用bash从文件中读取数据并使用awk获取某些列的总和,bash,unix,awk,Bash,Unix,Awk,假设我想通过一个.txt文件收集一些统计信息,该文件如下所示: misses 15 hit 18 misses 20 hit 31 我编写了一个bash脚本,只打印每一行: #!/bin/bash while read line do echo $line done <t.txt 我已经搜索过了,这可以用awk完成。 您能用awk帮助完成这项工作吗?只需将您的算法转换为bash: #!/bin/bash while read

假设我想通过一个.txt文件收集一些统计信息,该文件如下所示:

misses 15
hit 18
misses 20
hit 31
我编写了一个bash脚本,只打印每一行:

#!/bin/bash 
while read line           
do           
    echo $line 
done <t.txt 
我已经搜索过了,这可以用awk完成。
您能用awk帮助完成这项工作吗?

只需将您的算法转换为bash:

#!/bin/bash 
while read what count ; do           
    case $what in
        (hit)    let total_h+=count ;;
        (misses) let total_m+=count ;;
        (*)      echo Invalid input >&2; exit ;;
    esac
done < t.txt
echo Hits: $total_h, Misses: $total_m
#/bin/bash
读什么算什么;做
案例$what in
(hit)让total_h+=计数;;
(未命中)让total_m+=计数;;
(*)回显无效输入>&2;出口
以撒
完成
只需将您的算法转换为bash:

#!/bin/bash 
while read what count ; do           
    case $what in
        (hit)    let total_h+=count ;;
        (misses) let total_m+=count ;;
        (*)      echo Invalid input >&2; exit ;;
    esac
done < t.txt
echo Hits: $total_h, Misses: $total_m
#/bin/bash
读什么算什么;做
案例$what in
(hit)让total_h+=计数;;
(未命中)让total_m+=计数;;
(*)回显无效输入>&2;出口
以撒
完成
不需要任何bash gubbins,awk将完成所有工作

awk 'BEGIN{ hits=0; misses=0; }/^hit/{ hits+=$NF}; /^misses/{misses=$NF}; END {print "Hits: " hits "\nMisses: " misses }' txtfile
确定此一衬套的3个零件:

BEGIN{ hits=0; misses=0; }
仅在awk从txtfile读取任何行并初始化两个变量hits和misses之前运行一次

/^hits/{ hits+=$NF}; /^misses/{misses=$NF};
awk '/misses/||/hit/{a[$1]+=$2}END{print "total hits",a["hit"],",and total misses",a["misses"]}' your_file
在每行上运行,如果该行以hits开头,则最后一列将添加到hits变量,如果该行以misses开头,则misses变量将最后一列添加到该行

END {print "Hits: " hits "\nMisses: " misses' }

只在处理完所有行后运行,并打印出一条详细说明命中和未命中的消息。

不需要任何bash gubbins,awk将完成所有操作

awk 'BEGIN{ hits=0; misses=0; }/^hit/{ hits+=$NF}; /^misses/{misses=$NF}; END {print "Hits: " hits "\nMisses: " misses }' txtfile
/^hits/{ hits+=$NF}; /^misses/{misses=$NF};
awk '/misses/||/hit/{a[$1]+=$2}END{print "total hits",a["hit"],",and total misses",a["misses"]}' your_file
确定此一衬套的3个零件:

BEGIN{ hits=0; misses=0; }
仅在awk从txtfile读取任何行并初始化两个变量hits和misses之前运行一次

/^hits/{ hits+=$NF}; /^misses/{misses=$NF};
awk '/misses/||/hit/{a[$1]+=$2}END{print "total hits",a["hit"],",and total misses",a["misses"]}' your_file
在每行上运行,如果该行以hits开头,则最后一列将添加到hits变量,如果该行以misses开头,则misses变量将最后一列添加到该行

END {print "Hits: " hits "\nMisses: " misses' }
仅在处理完所有行后运行,并打印出详细说明命中和未命中的消息

/^hits/{ hits+=$NF}; /^misses/{misses=$NF};
awk '/misses/||/hit/{a[$1]+=$2}END{print "total hits",a["hit"],",and total misses",a["misses"]}' your_file
测试:

> cat temp
misses 15
hit 18
misses 20
hit 31
hait 31
> awk '/misses/||/hit/{a[$1]+=$2}END{print "total hits",a["hit"],",and total misses",a["misses"]}' temp
total hits 49 ,and total misses 35
测试:

> cat temp
misses 15
hit 18
misses 20
hit 31
hait 31
> awk '/misses/||/hit/{a[$1]+=$2}END{print "total hits",a["hit"],",and total misses",a["misses"]}' temp
total hits 49 ,and total misses 35
declare misses=0 hit=0
读取var-val时;做
让$var+=val
完成
声明未命中=0命中=0
读取var-val时;做
让$var+=val
完成
请展示您尝试过的内容。@chepner我已经把我的脚本放在这里了。只是读每一行。忘记关于awk的事情吧,终端中没有打印任何内容。在
awk
中,这很容易做到。如果您让我们看看您是如何尝试解决问题的,那么您将了解更多信息,这样我们就可以向您展示如何解决问题,而不仅仅是为您编写程序。请展示您已经尝试过的内容。@chepner我已经把我的脚本放在这里了。只是读每一行。忘记关于awk的事情吧,终端中没有打印任何内容。在
awk
中,这很容易做到。如果您让我们看看您是如何尝试解决问题的,那么我们可以向您展示如何解决问题,而不仅仅是为您编写程序,您将了解更多。