faddist88 пишет:Как обработать таблицу в bash?
Здравствуйте. В каждой таблице, если это именно таблица, а не набор строк, должен присутствовать разделитель полей/столбцов. Если его нет - значит это обычный текст, который так же бесполезно разбивать на столбцы/поля, как искать иголку в стоге сена. Если нет разделителя - мы читаем обычную страницу из любой книги и неважно, что соседние ячейки соответствуют определённому формату: содержит она пробел или не содержит, стоит там точка или не стоит, похожа она на ту, что сверху/снизу или нет. Без разделителя вся эта писанина, называемая таблицей - обычный набор текста, который ничем не структурирован.
Предположим, что Ваша программа gentbl всё же сгенерировала Вашу таблицу как таблицу и разделителем полей является табуляция (TAB). Тогда Ваша задача может быть решена старым дедовским способом, например через промежуточные файлы (их будет не менее 4-х):
Скрипт ./start.sh
#!/bin/bash
#Если разделитель полей - табуляция, то...
#Нормализация исходной таблицы ./table: убираем заголовок, заменяем все пробелы на '_',
#выделяем статус 'active' и сохраняем всё это добро в файл ./table_normalized
cat ./table | tr ' ' '_' | tail -n+2 | grep 'active' > ./table_normalized
#Список уникальных имён сохраняем в файл ./owners
cat ./table_normalized | cut -f2 | sort | uniq > ./owners
#Сохраняем список сумм для каждого пользователя в файлы ./sum_ИмяПользователя
while read p; do
cat table_normalized | grep "$p" | cut -f3 | grep -v '_' > "sum_$p"
done < ./owners
#Подсчет суммы для каждого owner-а из их собственных файлов ./sum_ИмяПользователя
for i in $(ls ./sum_*); do
#Обнуляем счётчик сумм
result=0
while read p; do
let result=result+"$p"
done < $i
echo "Сумма для $(echo $i | cut -c 7-): $result"
done
read -p "Enter - выйти..."
Результат работы:
> ./start.sh
Сумма для Alpha_A.: 101
Сумма для Betta: 364
Enter - выйти...
Скачать рабочий пример с нормальной таблицей...
MSI H81M-ECO, Intel Core i3-4130T, Intel HD Graphics 4400 | MgaRemix-9 Budgie 10.8.1 x86_64 + Windows 10