3

.shログファイルを取得してデータを抽出し、レポートを作成するファイルがあります。全回線のうち、エラー ポップアップ (トップ トーカー) が発生する割合を計算したいと思います。

これまでのところ、私はこれを持っています:

awk '// {print $4, substr($0, index($0,$9))}' | sort \
                        | uniq -cd | sort -nr | head -n20 > $filename-sr1.tmp

これは 2 つの列を出力し、カウントの後に行が続きます。

計算を行うためにカウントだけを取るにはどうすればよいですか。例えば。count / total_lines = 0.000000...

4

2 に答える 2

4

ここでは awk のみを使用していますが、出力順序は任意であるため、並べ替え -n にパイプすることをお勧めします。

$ cat file
foo
foo
bar
foo
quux
quux
$ awk '{a[$0]++} END{for (i in a) if (a[i]>1) printf "%5.2f%%\t%s\n", 100*a[i]/NR, i}' file
 33.3%  quux
 50.0%  foo

そして、現在の awk を適応させます:

awk '{a[$4" "substr($0, index($0,$9))]++} END{for (i in a) if (a[i]>1) printf "%5.2f%%\t%s\n", 100*a[i]/NR, i}'
# or possibly
awk '{s=$4; for(i=9;i<=NF;++i) s=s" "$i; a[s]++} END{for (i in a) if (a[i]>1) printf "%5.2f%%\t%s\n", 100*a[i]/NR, i}'
于 2012-08-14T22:23:20.380 に答える
3

最初に私はあなたにいくつかの同様の出力を得るために探しました

cat text.txt | sort | uniq -cd | sort -nr | head -n20 > output.txt

output.txtは次のようになります。

      5 red
      3 orange
      3 blue
      2 green

うまくいけば、それはあなたが持っている出力に似ていますか?

パーセンテージを取得するには、元のファイルの行をカウントしてから、出力ファイルの各行をループし、cutを使用して各単語/フレーズのカウントを切り取り、bcを使用して合計を計算します。

total_lines=$(wc -l < text.txt)
while read -r line; do 
    count=$(echo $line | cut -f1 -d " "); 
    percent=$(echo "scale=4; ($count/$total_lines)*100" | bc); 
    echo "$percent% -- $line"; 
done < output.txt;

結果は次のようになります。

38.4600% -- 5 red
23.0700% -- 3 orange
23.0700% -- 3 blue
15.3800% -- 2 green
于 2012-08-14T21:44:00.637 に答える