我的 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/