Как мне проанализировать CSV-файл, чтобы найти «сбои» в файле, который находится в столбце 2 и найти среднее значение столбца 7 - PullRequest
0 голосов
/ 03 февраля 2020
grep "false" $1 | cut -d ',' -f2,7

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

1 Ответ

0 голосов
/ 03 февраля 2020

Не совсем понятно, что вы пытаетесь сделать, но если вы ищете среднее арифметическое c для всех вторых полей, разделенных запятыми («столбцы»), где седьмое поле равно false, то вот ответ с использованием awk:

awk -F ',' '$7 == "false" { f++; sum += $2 } END { print sum / f }' "$@"

Это устанавливает разделитель полей равным ,, а затем анализирует только те строки, чье седьмое (разделенное запятыми) поле равно false (также рассмотрим tolower($7) == "false" ), увеличивая счетчик (f) и добавляя второй столбец к переменной sum. После прохождения всех строк всех входных файлов, сценарий печатает среднее арифметическое c путем деления суммы на количество строк, на которые он набрал ключи. Завершающий "$@" отправит каждый аргумент в ваш скрипт оболочки в виде файла для этой команды awk.

Примечание к полям: awk индексируется, но 0 часто имеет специальный ценность. $0 - это целая строка, $1 - это первое поле и т. Д. awk довольно гибок, поэтому вы также можете делать такие вещи, как $i, чтобы ссылаться на поле, представленное переменной i, включая такие вещи, как $(NF-1), чтобы ссылаться на содержимое поля перед последним полем line.

Запятые без разделителей: Если ваши данные могли иметь значения в кавычках с запятыми или экранированные запятые, вычисление поля в awk (или в cut) выиграло не работает Правильный синтаксический анализатор CSV (требующий более полного языка, чем bash, плюс такие дополнения, как awk, sed или cut) предпочтительнее, чем ваш собственный. В качестве альтернативы, если вы управляете форматом, вы можете рассмотреть другой разделитель, такой как Tab или выделенный символ разделителя записей ASCII (RS, он же U+001E, Разделитель информации два, который вы можете ввести в bash как $'\x1e' и awk (и большинство других языков) как "\x1e").

...