0

假设我想收集一些关于 .txt 文件的统计信息,如下所示:

misses 15
hit 18
misses 20
hit 31

我写了一个 bash 脚本,它只打印每一行:

#!/bin/bash 
while read line           
do           
    echo $line 
done <t.txt 

我现在想要的是:这个例子是伪代码:

read every line
   if first column is miss add the number to total misses
   if hits add the number to total hits

print total hits, and total misses in a file

我已经搜索过了,这可以用 awk 完成。你能用 awk 帮忙吗?

4

4 回答 4

2
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
于 2013-01-23T14:03:08.427 回答
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
于 2013-01-23T13:38:49.113 回答
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/{ hits+=$NF}; /^misses/{misses=$NF};

在每一行上运行,如果该行以 hits 开头,则将最后一列添加到 hits 变量中,如果它以未命中开始,则未命中变量将最后一列添加到其中。

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

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

于 2013-01-23T13:38:58.777 回答
0
declare misses=0 hit=0
while read var val; do
    let $var+=val
done < f.txt
echo "Misses: $misses"
echo "Hits: $hit"
于 2013-01-23T14:29:45.853 回答