我对这些事情还很陌生,因此确实需要一些帮助。
我试图制作一个Shell脚本,该脚本将从一个或多个数据库中提取数据,将其导出为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
现在,每次我运行shell命令时,它都应更新/替换file.csv,同时维护或重新添加特定单元格的公式。之前和之后的示例:
第一次运行shell脚本:
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
第二次运行Shell脚本:
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的某些内容不确定如何进行。
请保持简单。
谢谢
答案 0 :(得分:0)
您可以使用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