根据条件将bash中的CSV文件拆分为多个文件

时间:2019-08-05 07:57:06

标签: linux bash csv

我的csv文件包含多行数据,我想根据一个属性将其拆分为多个文件。

beeline -u jdbc:hive2:<MYHOST> -n <USER> -p <PASSWORD> --silent=true --outputformat=csv2 -f <SQL FILE> > result_+%Y%m%d_%H%M%S.csv

带有ORDER BY ID的SQL代码是从直线上触发的,它会创建单个CSV。

cat sql.csv
"attr;attr;ID;attr"
"data;data;XXXX;date"
"data;data;XXXX;date"
"data;data;YYYYY;date"
"data;data;YYYYY;date"
"data;data;BBBBB;date"
"data;data;BBBBB;date"

期望的结果是,一旦识别出新的ID并使用文件名中的ID,就进行拆分。

file_1_ID_XXXX_+%Y%m%d_%H%M%S

attr   attr    ID  attr
data    data    XXXX    date
data    data    XXXX    date

file_2_ID_YYYYY_+%Y%m%d_%H%M%S

attr   attr    ID  attr
data    data    YYYYY   date
data    data    YYYYY   date

1 个答案:

答案 0 :(得分:2)

如果我理解您的问题,则可以使用sql生成的csv文件,然后通过使用一些变量,字符串串联然后重定向到输出文件(例如

awk -v field=a -v n=1 -v dt=$(date '+%Y%m%d_%H%M%S') '
    FNR == 1 {hdg=$0; next}
    a != $3 {a = $3; name="file_"n"_ID_"a"_"dt; n++; print hdg > name}
    {print $0 > name}
' sqldata

示例输入文件

您的sqldata文件包含:

$ cat sqldata
attr    attr    ID  attr
data    data    XXXX    date
data    data    XXXX    date
data    data    YYYYY   date
data    data    YYYYY   date
data    data    BBBBB   date
data    data    BBBBB   date

使用/输出文件示例

以正确的文件名简单地将awk脚本复制并粘贴到终端中,将产生以下三个输出文件:

$ cat file_1_ID_XXXX_20190805_033514
attr    attr    ID  attr
data    data    XXXX    date
data    data    XXXX    date

$ cat file_2_ID_YYYYY_20190805_033514
attr    attr    ID  attr
data    data    YYYYY   date
data    data    YYYYY   date

$ cat file_3_ID_BBBBB_20190805_033514
attr    attr    ID  attr
data    data    BBBBB   date
data    data    BBBBB   date

仔细检查一下,让我知道这是否是您想要的。如果没有,请告诉我,我很乐意进一步提供帮助。