使用Shell脚本更新CSV文件

时间:2019-02-05 14:32:16

标签: bash shell csv awk cat

我对这些事情还很陌生,因此确实需要一些帮助。

我试图制作一个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的某些内容不确定如何进行。

请保持简单。

谢谢

1 个答案:

答案 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