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

标签 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

最佳答案

如果我理解你的问题,你可以获取由 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

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

关于linux - 根据条件将 bash 中的 CSV 文件拆分为多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57354409/

相关文章:

python - 将四个并行运行的python程序的输出保存到不同的日志文件

java - 在 Tomcat 上实现 Jersey 时出现 "javax.servlet.ServletException: java.lang.NoClassDefFoundError"

linux - 以下 "top"命令: top -p `pgrep process-name | tr "\\n" "," | sed 's/,$//' `的语法简单解释是什么

bash - Bash 中的 $RANDOM 不起作用

python - _csv 问题。错误 : sequence expected

r - 使用 sparklyr 指定列类

linux - 如何在没有 SSH 的情况下远程重启 Linux 服务器?

realpath 函数的转换问题(C 编程)

mysql - 使用 Grep 在每行循环中创建多个变量 - BASH

c++ - 带有分隔符的 getline 存储一个空字符