3

我有一个.sh文件,它需要一个日志文件并提取数据并制作报告。我想计算弹出错误的总行数的百分比(热门话题)。

到目前为止,我有这个:

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

这会输出两列,计数后跟行。

我怎样才能只用计数来进行计算。例如。count / total_lines = 0.000000...

4

2 回答 2

4

这里只使用 awk,尽管输出顺序是任意的,所以您可能希望将其通过管道传递给 sort -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 回答