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

アルゴリズムを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

この1つのライナーに3つのパーツを追加します。

BEGIN{ hits=0; misses=0; }

awkがtxtfileから行を読み取り、2つの変数のヒットとミスを初期化する前に1回だけ実行されます。

/^hits/{ hits+=$NF}; /^misses/{misses=$NF};

は各行で実行され、行がヒットで始まる場合は最後の列がヒット変数に追加され、ミスで始まる場合はミス変数が最後の列を追加します。

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

すべての行が処理された後にのみ実行され、ヒットとミスの詳細を示すメッセージが出力されます。

于 2013-01-23T13:38:58.777 に答える
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 に答える
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 に答える