2013-07-22 4 views
-2

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

TOTAL  SUCCESS FAILED AVERAGE SUCCESS AVERAGE FAILED 
===================================================================== 
    6139386 2079679 4059707  33.874381   66.125619 

который только он также создает файл для каждого отдельного события, я имею в виду файл для успешной транзакции, один для неудачных транзакций и один для всех транзакций

Теперь, из файла с отказами, мне нужно подробно узнать, какие ошибки сделали транзакцию неудачной и их частоту.

Я сделал этот код

cat /tmp/test1.txt | grep "|-1|" | cut -d'|' -f34 > /tmp/test3_1.txt

ERR=$(sort test3_1.txt | uniq -c)

Где test1.txt это файл, в котором неудачные операции хранятся и test3_1.txt является файл, в котором хранятся ошибки

Как вы можете видеть, я сохранил этот выход в переменной, которая будет использоваться позже, и это результат

82  -11 
7241  -4 
10040 1 
7  10 
3115778 1000 
146  10002035 

Когда число в левой частота и число в праве код ошибки

Пока это только то, что я хотел, но мне нужно сделать также среднее соотношение для каждого кода ошибки основанный на его частоте и общей неудачных сделок, в основном за столом, как этот

82  -11  0.002% 
7241 -4  0.178% 
10040 1   0.247% 
7  10  0.000% 
3115778 1000  76.749% 
146  10002035 0.004% 

Исходя из общего количества неудачных сделок (4059707)

Теперь, что я не знаю, чтобы сделать это, чтобы выбрать только левый столбец, чтобы сделать правильный кал чтобы получить среднее отношение каждой из ошибок и показать его в правой колонке.

я получил до сих пор этот код:

for i in $(awk '{print $1}' test3_1.txt) do; 
AVEE=$($i * 100 | bc) 

Но это не сработало

+0

какой вход у вас есть и какой вывод вы хотите? сумма 1-го столбца вывода вашего cmd '! = 4059707'. Это нормально? Или я не понимаю это правильно. – Kent

+0

putput у меня есть первая таблица (2 столбца), и тот, который я хочу, является вторым (3 столбца). '4059707' является суммой неудачных транзакций –

+0

, пожалуйста, объясните, из вашей ** первой таблицы **, как я могу получить номер' 4059707'? – Kent

ответ

0

Это один лайнер будет делать работу:

awk '{s+=$1;i[NR]=$1" "$2;a[i[NR]]=$1}END{for(x in i)print i[x],sprintf("%.3f%", 100*a[i[x]]/s)}' file 
  • вы могли бы изменить "%.3f% получить другой формат.
  • , если вы хотите иметь лучший выходной формат, который вы могли awk....|column -t

здесь является тест:

kent$ awk '{s+=$1;i[NR]=$1" "$2;a[i[NR]]=$1}END{for(x in i)print i[x],sprintf("%.3f%", 100*a[i[x]]/s)}' file|column -t 
82  -11  0.003% 
7241  -4  0.231% 
10040 1   0.320% 
7  10  0.000% 
3115778 1000  99.441% 
146  10002035 0.005% 

Этот тест был сделан на неполную примере, приведенном OP (см комментарии под вопросом), результат может отличаться от результата OP.

+0

Я попробовал 'awk '{s + = $ 1; i [NR] = $ 1" "$ 2; a [i [NR]] = $ 1} END {для (x in i) напечатать i [x], sprintf ("%. 3f% ", 100 * a [i [x]]/s)} '" $ ERR "| column -t', но он не работает –

+0

@AntonioPerezOseguera Ваш' $ ERR' не является файлом, вы не можете сделать это с помощью AWK. вы могли бы «эхо» $ ERR »| awk ... | column -t' – Kent

+0

извините за задержку, я понял, что он не будет работать с переменной после того, как я прокомментировал ваш ответ. На самом деле это работает довольно хорошо прямо сейчас, просто, как одолжение, не могли бы вы объяснить код ?! Я пытаюсь учиться и избегать задавать такие глупые вопросы, как этот –

Смежные вопросы