<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Linux Forum &mdash; Bash работа с таблицами]]></title>
	<link rel="self" href="https://linuxforum.ru/extern.php?action=feed&amp;tid=40852&amp;type=atom" />
	<updated>2022-04-27T10:44:53Z</updated>
	<generator>PunBB</generator>
	<id>https://linuxforum.ru/viewtopic.php?id=40852</id>
		<entry>
			<title type="html"><![CDATA[Re: Bash работа с таблицами]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=470119#p470119" />
			<content type="html"><![CDATA[<p><strong>alex_q_2000</strong>, да тут проще можно сделать.<br />1. Считываем строку.<br />2. Если первые 6 символов образуют слово &quot;active&quot; (для надёжности приведём к нижнему регистру), переходим к шагу 3, иначе возврат на шаг 1.<br />3. Считываем из конца строки по одному символу, если это цифры. Если нет - имеем ноль. Прибавляем полученное значение к сумме.<br />4. Пока не достигнут конец файла, переход к шагу 1.</p><p>Кстати, цифры в конце строки можно вырезать регулярным выражением: <span style="color: #cc0000"><strong>/(\d*)$/gi</strong></span>, дальше пусть автор темы сам подумает. Если в конце цифр нет, это выражение вернёт пустую строку.</p><p>Ну или сразу для полного анализа строки: <span style="color: #cc0000"><strong>/active .+ (\d*)$/gi</strong></span> (обратите внимание на пробелы в выражении, они там нужны!).</p>]]></content>
			<author>
				<name><![CDATA[Rizado]]></name>
				<uri>https://linuxforum.ru/profile.php?id=23158</uri>
			</author>
			<updated>2022-04-27T10:44:53Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=470119#p470119</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Bash работа с таблицами]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=470118#p470118" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>faddist88 пишет:</cite><blockquote><p>Как обработать таблицу в bash?</p></blockquote></div><p>Здравствуйте. В каждой таблице, если это именно таблица, а не набор строк, должен присутствовать разделитель полей/столбцов. Если его нет - значит это обычный текст, который так же бесполезно разбивать на столбцы/поля, как искать иголку в стоге сена. Если нет разделителя - мы читаем обычную страницу из любой книги и неважно, что соседние ячейки соответствуют определённому формату: содержит она пробел или не содержит, стоит там точка или не стоит, похожа она на ту, что сверху/снизу или нет. Без разделителя вся эта писанина, называемая таблицей - обычный набор текста, который ничем не структурирован.</p><p>Предположим, что Ваша программа gentbl всё же сгенерировала Вашу таблицу <span class="bbu">как таблицу</span> и разделителем полей является табуляция (TAB). Тогда Ваша задача может быть решена старым дедовским способом, например через промежуточные файлы (их будет не менее 4-х):</p><p>Скрипт ./start.sh<br /></p><div class="codebox"><pre><code>#!/bin/bash

#Если разделитель полей - табуляция, то...

#Нормализация исходной таблицы ./table: убираем заголовок, заменяем все пробелы на &#039;_&#039;,
#выделяем статус &#039;active&#039; и сохраняем всё это добро в файл ./table_normalized
cat ./table | tr &#039; &#039; &#039;_&#039; | tail -n+2 | grep &#039;active&#039; &gt; ./table_normalized

#Список уникальных имён сохраняем в файл ./owners
cat ./table_normalized | cut -f2 | sort | uniq &gt; ./owners

#Сохраняем список сумм для каждого пользователя в файлы ./sum_ИмяПользователя
while read p; do
 cat table_normalized | grep &quot;$p&quot; | cut -f3 | grep -v &#039;_&#039; &gt; &quot;sum_$p&quot;
done &lt; ./owners

#Подсчет суммы для каждого owner-а из их собственных файлов ./sum_ИмяПользователя
for i in $(ls ./sum_*); do
#Обнуляем счётчик сумм
result=0

while read p; do
 let result=result+&quot;$p&quot;
done &lt; $i

echo &quot;Сумма для $(echo $i | cut -c 7-): $result&quot;
done

read -p &quot;Enter - выйти...&quot;</code></pre></div><p>Результат работы:<br /></p><div class="codebox"><pre><code>&gt; ./start.sh
Сумма для Alpha_A.: 101
Сумма для Betta: 364
Enter - выйти...</code></pre></div><p><a href="https://cloud.mail.ru/public/4bV6/qVz35DAit">Скачать рабочий пример с нормальной таблицей...</a></p>]]></content>
			<author>
				<name><![CDATA[alex_q_2000]]></name>
				<uri>https://linuxforum.ru/profile.php?id=41015</uri>
			</author>
			<updated>2022-04-27T09:05:07Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=470118#p470118</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Bash работа с таблицами]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=470117#p470117" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>faddist88 пишет:</cite><blockquote><p>for line in $(gentbl)<br />do<br />&nbsp; парсим строку $line<br />done</p><p>Но в этом случае в $line записываются не строки целиком, а слова или символы разделенные пробелами.</p></blockquote></div><p>парсить в цикле по строкам по разделителю CR<br />&nbsp; &nbsp; парсить в цикле по строкам по разделителю пробелу<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;обрабатывать табличное значение<br />&nbsp; &nbsp; дальше<br />дальше</p>]]></content>
			<author>
				<name><![CDATA[ValentinK]]></name>
				<uri>https://linuxforum.ru/profile.php?id=41064</uri>
			</author>
			<updated>2022-04-26T16:38:50Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=470117#p470117</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Bash работа с таблицами]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=470116#p470116" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>faddist88 пишет:</cite><blockquote><p>Можно ссылку с примером чтобы было понятно как это сделать. Это можно будет потом таскать между серверами на разных ОС и железе?</p></blockquote></div><p>От железа зависеть практически не будет, а вот под Linux/Windows надо будет отдельно компилировать.<br />А ссылку - вопрос слишком абстрактный, записит от того, на каком языке писать.</p>]]></content>
			<author>
				<name><![CDATA[Rizado]]></name>
				<uri>https://linuxforum.ru/profile.php?id=23158</uri>
			</author>
			<updated>2022-04-26T13:11:07Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=470116#p470116</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Bash работа с таблицами]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=470115#p470115" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>ValentinK пишет:</cite><blockquote><div class="quotebox"><cite>faddist88 пишет:</cite><blockquote><p>Опять же можно пример или ссылку</p></blockquote></div><p>создать массив строк<br />ввести текст<br />в цикле пока не закончится строка<br />&nbsp; &nbsp; искать разделитель строки<br />&nbsp; &nbsp; добавить строку в массив строк<br />дальше</p></blockquote></div><br /><p>Алгоритм понятен. Я даже пробовал конструкции типа<br />for line in $(gentbl)<br />do<br />&nbsp; парсим строку $line <br />done</p><p>Но в этом случае в $line записываются не строки целиком, а слова или символы разделенные пробелами.</p><p>Если использовать такую конструкцию<br />result=$(gentbl)<br />То в каждой строке своя ячейка, но там где ячейки пустые там нет пустой строки<br /><strong>*** Добавлено: 26.04.2022 11:35:59 ***</strong></p><p>Как распарсить строку я более-менее понимаю. Проблема именно в способе перебора строк вывода результата<br /></p>]]></content>
			<author>
				<name><![CDATA[faddist88]]></name>
				<uri>https://linuxforum.ru/profile.php?id=42047</uri>
			</author>
			<updated>2022-04-26T08:35:59Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=470115#p470115</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Bash работа с таблицами]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=470114#p470114" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>faddist88 пишет:</cite><blockquote><p>Опять же можно пример или ссылку</p></blockquote></div><p>создать массив строк<br />ввести текст<br />в цикле пока не закончится строка<br />&nbsp; &nbsp; искать разделитель строки<br />&nbsp; &nbsp; добавить строку в массив строк<br />дальше</p>]]></content>
			<author>
				<name><![CDATA[ValentinK]]></name>
				<uri>https://linuxforum.ru/profile.php?id=41064</uri>
			</author>
			<updated>2022-04-26T07:44:08Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=470114#p470114</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Bash работа с таблицами]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=470113#p470113" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Rizado пишет:</cite><blockquote><div class="quotebox"><cite>faddist88 пишет:</cite><blockquote><p>чтобы работало всегда вне зависимости от установленных библиотек</p></blockquote></div><p>Вариант с компиляцией в двоичный код не подходит?</p></blockquote></div><p>Можно ссылку с примером чтобы было понятно как это сделать. Это можно будет потом таскать между серверами на разных ОС и железе?<br /><strong>*** Добавлено: 26.04.2022 10:34:40 ***</strong></p><div class="quotebox"><cite>ValentinK пишет:</cite><blockquote><div class="quotebox"><cite>faddist88 пишет:</cite><blockquote><p> как выделять в переменную целую строку из вывода</p></blockquote></div><p>написать парсер.<br />искать символ CR во вводе.<br />или использовать функцию языка типа как cin &gt;&gt; a или readln(a);</p></blockquote></div><p>Опять же можно пример или ссылку<br /></p>]]></content>
			<author>
				<name><![CDATA[faddist88]]></name>
				<uri>https://linuxforum.ru/profile.php?id=42047</uri>
			</author>
			<updated>2022-04-26T07:34:40Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=470113#p470113</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Bash работа с таблицами]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=470112#p470112" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>faddist88 пишет:</cite><blockquote><p> как выделять в переменную целую строку из вывода</p></blockquote></div><p>написать парсер.<br />искать символ CR во вводе.<br />или использовать функцию языка типа как cin &gt;&gt; a или readln(a);</p>]]></content>
			<author>
				<name><![CDATA[ValentinK]]></name>
				<uri>https://linuxforum.ru/profile.php?id=41064</uri>
			</author>
			<updated>2022-04-26T07:30:54Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=470112#p470112</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Bash работа с таблицами]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=470111#p470111" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>faddist88 пишет:</cite><blockquote><p>чтобы работало всегда вне зависимости от установленных библиотек</p></blockquote></div><p>Вариант с компиляцией в двоичный код не подходит?</p>]]></content>
			<author>
				<name><![CDATA[Rizado]]></name>
				<uri>https://linuxforum.ru/profile.php?id=23158</uri>
			</author>
			<updated>2022-04-26T07:20:50Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=470111#p470111</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Bash работа с таблицами]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=470110#p470110" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>ValentinK пишет:</cite><blockquote><div class="quotebox"><cite>faddist88 пишет:</cite><blockquote><p>Очень желательно именно на bash, т.к. решение типовое, а python&#039;a может не быть</p></blockquote></div><p>bash не совсем для этого предназначен.<br />т.е. в нём нет встроенных средств для генерации таблиц.<br />напишите утилиту, на вашем любимом языке программирования.</p></blockquote></div><p>Понятно что bash не очень подходит - день гугления до создания темы мне это подсказало, но очень хочется реализовать именно на bash, чтобы работало всегда вне зависимости от установленных библиотек и т.д. Понимаю что это попытка совершуть кругосветное путешествие на мопеде: очень сложно, но в целом можно. Только подскажите как выделять в переменную целую строку из вывода. Как разбирать строку мне уже более менее понятно.</p>]]></content>
			<author>
				<name><![CDATA[faddist88]]></name>
				<uri>https://linuxforum.ru/profile.php?id=42047</uri>
			</author>
			<updated>2022-04-26T07:00:52Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=470110#p470110</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Bash работа с таблицами]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=470106#p470106" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>faddist88 пишет:</cite><blockquote><p>Очень желательно именно на bash, т.к. решение типовое, а python&#039;a может не быть</p></blockquote></div><p>bash не совсем для этого предназначен.<br />т.е. в нём нет встроенных средств для генерации таблиц.<br />напишите утилиту, на вашем любимом языке программирования.</p>]]></content>
			<author>
				<name><![CDATA[ValentinK]]></name>
				<uri>https://linuxforum.ru/profile.php?id=41064</uri>
			</author>
			<updated>2022-04-26T02:30:08Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=470106#p470106</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Bash работа с таблицами]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=470105#p470105" />
			<content type="html"><![CDATA[<p>Очень желательно именно на bash, т.к. решение типовое, а python&#039;a может не быть</p>]]></content>
			<author>
				<name><![CDATA[faddist88]]></name>
				<uri>https://linuxforum.ru/profile.php?id=42047</uri>
			</author>
			<updated>2022-04-25T13:50:04Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=470105#p470105</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Bash работа с таблицами]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=470104#p470104" />
			<content type="html"><![CDATA[<p><strong>faddist88</strong>, реализация на bash критична? Если нет, пробуйте Python + библиотеку Numpy.</p>]]></content>
			<author>
				<name><![CDATA[Rizado]]></name>
				<uri>https://linuxforum.ru/profile.php?id=23158</uri>
			</author>
			<updated>2022-04-25T13:47:18Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=470104#p470104</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Bash работа с таблицами]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=470103#p470103" />
			<content type="html"><![CDATA[<p>Как обработать таблицу в bash?</p><p>Есть команда которая генерирует таблицу из трех колонок Status, Owner, Value. В столбце Status - текстовые значения, в стоблце Owner - текстовое значение может быть с пробелом, в колонке value - целочисленные, но могут быть пустые (вместо 0). Например:<br />#gentbl<br />Status&nbsp; Owner&nbsp; Value<br />active&nbsp; Alpha A.&nbsp; 101<br />active&nbsp; Betta&nbsp; 5<br />active&nbsp; Alpha A.&nbsp; <br />error&nbsp; Alpha A.&nbsp; 2<br />active&nbsp; Betta&nbsp; 359</p><p>Требуется подсчитать сумму значений по каждому владельцу в статусе active.</p><p>Пробовал разбирать по строкам через цикл for, но разбор идет не по строкам, а словам, причем из-за особенностей стоблбцов Owner и Value способ очень сложен.<br />for line in $(gentbl)<br />do<br />&nbsp; ...<br />done</p><p>Заранее спасибо</p>]]></content>
			<author>
				<name><![CDATA[faddist88]]></name>
				<uri>https://linuxforum.ru/profile.php?id=42047</uri>
			</author>
			<updated>2022-04-25T11:19:52Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=470103#p470103</id>
		</entry>
</feed>
