Как использовать uniq -cd в сценариях bash и извлекать только количество, а не строку?

У меня есть файл .sh, который берет файл журнала, извлекает данные и создает отчеты. Я хотел бы рассчитать, какой процент от общего количества строк вызывает всплывающее окно с ошибкой (топ-говорящие).

Пока у меня это:

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

Это выводит два столбца, за числом следует строка.

Как я могу взять только счет, чтобы сделать расчеты. Например. count / total_lines = 0.000000...


person MikeyC343    schedule 14.08.2012    source источник


Ответы (2)


Здесь используется только 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}'
person geirha    schedule 14.08.2012
comment
Спасибо за ответ ... хотя, если вы можете обратить свое внимание на мой ответ на ответ выше, вы также можете мне помочь ... спасибо :) - person MikeyC343; 16.08.2012
comment
Трубка к sort -nr :) - person Acumenus; 28.11.2013

Сначала я хотел получить что-то похожее на вас

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
person theon    schedule 14.08.2012
comment
ОК, это работает... Шаг 2 - перенос в .bat:/ в основном я создаю отчеты в среде Linux и Windows. Вы не могли бы помочь мне с версией летучей мыши сейчас, не так ли? Я немного схитрил и установил gawk и coreutils на свою машину с Windows из GNU :p - person MikeyC343; 16.08.2012
comment
@MikeyC343 МайкиC343 Тогда вы всего на один шаг ближе к установке bash и на машину с Windows ... тогда у вас может быть один скрипт, который работает в обеих системах. Опять же, у вас уже есть awk, поэтому вы можете просто сделать все это с помощью awk и отказаться от требования bash/cmd.exe. - person geirha; 16.08.2012