LINUX.ORG.RU

Фильтрация строк в AWK перед подсчетом итоговой суммы

 


0

1

Здравствуйте, подскажите пожалуйста как с помощью конструкции if ($9 == "6") отфильтровать данные для подсчета итоговой суммы?

У меня есть запрос:

awk -F";" '{sum += $8} {OFS="|"; if ($9 == "6") print $3} END {print sum}' file.csv

Он отображает фильтрованные данные, но выводит сумму без учета фильтрации. Пробовал добавить конструкцию if ($9 == "6") в секцию BEGIN и END - безуспешно.


Ответ на: комментарий от iron
1042;"ЛОЖЬ";;;"Фирма1";"Объект1";"Вид1";;0,4;3;"Улица1";;"Кадастровый1";205;"ЛОЖЬ";;; 982;"ЛОЖЬ";"Номер";"41/21";"Фирма2";"Объект2";"Вид2";100;0,4;3;"Улица2";;"Кадастровый2";205;"ЛОЖЬ";"Дата2";"Дата2.1";"Документ2"
948;"ЛОЖЬ";;;"Фирма3";"Объект3";"Вид3";90;6;3;"Улица3";;"Кадастровый3";205;"ЛОЖЬ";;;
Gnom7
() автор топика

А может тебе уже SQL взять? А то ты третью тему подряд с этими однострочниками мучаешься. Смотри.

# добавляем названия полей к CSV-файлу (если их ещё нет; можно вручную)
$ awk -F';' 'NR==1 { for(i=1;i<=NF;i++) printf("Поле%i%s",i,(i!=NF)?";":"\n");} {print}' bd-ao.csv > bd-ao-header.csv

# импортируем CSV в базу данных, в таблицу с названием "ao"
$ sqlite3 bd-ao.sqlite
sqlite> .mode csv
sqlite> .separator ';'
sqlite> .import "bd-ao-header.csv"  ao

# меняем режим отображения на "табличный"
sqlite> .mode table

# выполняем запросы
sqlite> SELECT Поле1,Поле5 FROM ao WHERE Поле1=982;
+-------+--------+
| Поле1 | Поле5  |
+-------+--------+
| 982   | Фирма2 |
+-------+--------+

sqlite> SELECT sum(Поле8) FROM ao WHERE Поле9=6;
+------------+
| sum(Поле8) |
+------------+
| 90         |
+------------+

# сразу после создания базы и импорта таблицы, из шелла SQLite можно выйти
# (команда `.exit` или просто Ctrl+D) и выполнять запросы из командной строки
$ sqlite3 bd-ao.sqlite 'SELECT Поле1,Поле5,Поле8,Поле9,Поле11 FROM ao' -markdown
| Поле1 | Поле5  | Поле8 | Поле9 | Поле11 |
|-------|--------|-------|-------|--------|
| 1042  | Фирма1 |       | 0,4   | Улица1 |
| 982   | Фирма2 | 100   | 0,4   | Улица2 |
| 948   | Фирма3 | 90    | 6     | Улица3 |

Вместо -markdown можно написать -table, -json, -html, -csv, -tabs. С последним удобно открывать файлы в Excel и других табличных процессорах.

$ sqlite3 bd-ao.sqlite 'SELECT * FROM ao' -tabs -header > bd-ao.xls

По-умолчанию, при импорте CSV, все поля таблицы имеют тип TEXT, что не всегда удобно. Например, такой запрос ничего не выдаст:

$ sqlite3 bd-ao.sqlite 'SELECT Поле1,Поле5 FROM ao WHERE Поле1<1000' -table

Чтобы сработало как ожидается, можно при запросе временно изменить тип поля:

$ sqlite3 bd-ao.sqlite 'SELECT Поле1,Поле5 FROM ao WHERE CAST(Поле1 AS INT)<1000' -table
+-------+--------+
| Поле1 | Поле5  |
+-------+--------+
| 982   | Фирма2 |
| 948   | Фирма3 |
+-------+--------+

Либо можно изменить схему таблицы, но это уже продвинутый уровень)

https://www.sqlitetutorial.net/sqlite-select/

anonymous
()
Ответ на: комментарий от anonymous

А может тебе уже SQL взять? А то ты третью тему подряд с этими однострочниками мучаешься. Смотри.

Уважаемый, anonymous! Я изучил Ваше сообщение.

Решил добиваться чтобы мне на рабочую Astra Linux установили: sqlite3 и библиотеку GUI для Python. До этого момента уперто (несмотря на рекомендации сторожил этого форума) хотел обойтись штатными средствами.

Низкий поклон за столь основательное сообщение!

Gnom7
() автор топика
Ответ на: комментарий от Gnom7

❤️

SQLite - это, можно сказать, просто один исполняемый файлик, около двух мегабайт, ты можешь сам его себе «установить» хоть на рабочий стол, если просто скачаешь дебиановский пакет и вытащить оттуда файл sqlite3.

В питоне, кстати, SQLite идёт в базовой поставке как библиотечка, так что даже получается так, что у тебя уже есть SQLite, просто у него интерфейс через питон: https://docs.python.org/3/library/sqlite3.html

Что касается модулей питона для GUI, то я тебе уже показывал способ, как ты сам их можешь установить в свою папку.

Astra Linux

Хотя я вот не уверен, что на астре можно установить программы в свою папку. Но ты попробуй, возможно, что всё получится.

Решил добиваться

Жёстко у вас там, конечно. А со своим компьютером можно?

anonymous
()