Не совсем понятно, что вы пытаетесь сделать, но если вы ищете среднее арифметическое 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"
).