Обновление файла CSV с использованием скрипта Shell - PullRequest
0 голосов
/ 05 февраля 2019

Я совершенно новичок в этих вещах, и мне действительно нужна помощь в этом.

Я пытаюсь создать сценарий оболочки, который будет извлекать данные из одной или нескольких баз данных, экспортировать их в CSV, объединить эти данные в один файл и применить некоторые формулы к файлу, например SUM, или проверить разницумежду числами.Я должен иметь возможность обновлять или заменять файл, если формулы будут по-прежнему применяться к новому файлу.

Что я получил до сих пор:

mysql -h host -u user -ppassword -P port 
"query" |tee file1.csv
# I didn't know how to have multiple queries for the same DB
mysql -h host2 -u user2 -ppassword2 -P port 
"query2" |tee file2.csv

sed -i 'li\FILE1' file1.csv #just to add a title
echo '' >> file1.csv #just to add a space at the end
sed -i 'li\FILE2' file2.csv 
echo '' >> file2.csv 
cat file1.csv file2.csv > file.csv

Это примеркак выглядит мой файл file.csv, но на самом деле он содержит больше похожих ячеек:

       A         B       C
1   C.Installs      
2   date        
3   2019-02-01  100 
4   2019-02-02  131 
5   2019-02-03  222 
6   2019-02-04  180 
7   2019-02-05  213 
8           
9   A.Installs      
10  Date        
11  2019-02-01  23  
12  2019-02-02  42  
13  2019-02-03  34  
14  2019-02-04  35  
15  2019-02-05  21  

Теперь каждый раз, когда я запускаю команду оболочки, он должен обновлять / заменять файл file.csv при сохранении или повторном добавлении формул дляконкретные клетки.Пример для BEFORE и AFTER:

Первый запуск сценария оболочки:

         A       B      C
1   C.Installs      
2   date        
3   2019-02-01  100 
4   2019-02-02  131 
5   2019-02-03  222 
6   2019-02-04  180 
7   2019-02-05  213 
8               846 #Formula of SUM for the 5 values
9   A.Installs      
10  Date        
11  2019-02-01  23  
12  2019-02-02  42  
13  2019-02-03  34  
14  2019-02-04  35  
15  2019-02-05  21  
16              155 #Formula of SUM for the 5 values
17          
18              691 #Formula of the difference between the two totals

Второй запуск сценария оболочки:

        A        B     C
1   C.Installs      
2   date        
3   2019-02-02  131 
4   2019-02-03  222 
5   2019-02-04  180 
6   2019-02-05  213 
7   2019-02-06  158 
8               904 #Formula of SUM for the 5 values
9   A.Installs      
10  Date        
11  2019-02-02  42  
12  2019-02-03  34  
13  2019-02-04  35  
14  2019-02-05  21  
15  2019-02-06  31  
16              163 #Formula of SUM for the 5 values
17          
18              741 #Formula of the difference between the two totals

Так что я думаю, чтоПервый шаг - найти способ применить формулы к CSV-файлу.

. Поэтому мне нужно опираться на то, что у меня есть, может быть, что-то с awk, я не уверен, как поступить, если честно, совершенно новый вэто.

Пожалуйста, будьте проще.

Спасибо

1 Ответ

0 голосов
/ 05 февраля 2019

Вы можете использовать csvkit https://csvkit.readthedocs.io/en/latest/scripts/csvsql.html

Начиная с

$ cat one.csv
2019-02-01,100
2019-02-02,131
2019-02-03,222
2019-02-04,180
2019-02-05,213

$ cat two.csv
2019-02-01,23
2019-02-02,42
2019-02-03,34
2019-02-04,35
2019-02-05,21

вы можете запустить

#!/bin/bash

# add header
sed -i  '1s/^/data,value\n/' one.csv
sed -i  '1s/^/data,value\n/' two.csv

one=$(csvsql --query "select sum(value) as sumOne from one" one.csv | tail -n +2)

two=$(csvsql --query "select sum(value) as sumOne from two" two.csv | tail -n +2)

echo "$one-$two" | bc

, чтобы иметь 691

...