【问题标题】:Split CSV file in bash into multiple files based on condition根据条件将bash中的CSV文件拆分为多个文件
【发布时间】:2019-08-05 07:57:06
【问题描述】:

我的 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 的直线触发的。

猫 sql.csv “属性;属性;ID;属性” “数据;数据;XXXX;日期” “数据;数据;XXXX;日期” “数据;数据;YYYYY;日期” “数据;数据;YYYYY;日期” "数据;数据;BBBBB;日期" "数据;数据;BBBBB;日期"

希望的结果是在识别出新的ID 后进行拆分,并在文件名中使用该ID

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

attr 属性 ID 属性 数据 数据 XXXX 日期 数据 数据 XXXX 日期

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

attr 属性 ID 属性 数据 数据 YYYYY 日期 数据 数据 YYYYY 日期

【问题讨论】:

    标签: linux bash csv


    【解决方案1】:

    如果我理解您的问题,您可以获取 sql 生成的 csv 文件,然后将其拆分为您显示的 3 个文件,只需使用一些变量、字符串连接然后重定向到输出文件,例如

    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
    

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

    【讨论】:

    • 我将a != $3 {a = $3 更改为a != $1 {a = $1,以防ID 是第一列,但数据被不同的属性分割。
    • 除非你有不同的数据,否则你的第1列只包含标题attr,然后其余记录都包含data,这不会按照你的要求做?
    • 我忘了提到 CSV 文件是逗号分隔的,而不是表格形式。 CurrentIy 我看到了奇怪的行为(数据被拆分但完全不同的属性是 ` ` 分隔日期)。可能是因为逗号分隔符,
    • 当我的 CSV 文件中有一个属性 ID 时,一切正常。当我添加更多属性时,脚本不会将数据解析为列,而是将每一行视为连接在一起。
    • 太棒了。很好地进行排序。每一个小小的胜利都是awk学到的另一个方面。一旦你克服了最初的神秘外观,awk 真的一点也不差。
    猜你喜欢
    • 2018-09-13
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多