首页 > 解决方案 > 使用 Shell 脚本更新 CSV 文件

问题描述

我对这些东西很陌生,真的需要一些帮助。

我正在尝试制作一个 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 的某些东西不知道如何进行,老实说,这完全是新的。

请保持简单。

谢谢

标签: bashshellcsvawkcat

解决方案


您可以使用 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


推荐阅读