【发布时间】:2021-09-22 13:49:34
【问题描述】:
我有一个包含几个大 csv 文件的文件夹,并且我希望有一个可变数量的几乎相同大小的 CSV 文件。
目前这是我的均匀分区实现:
#!/bin/bash
#copy header to all resulting files parts
head -n 1 $1_2021.csv | awk -v NPROC=$(nproc) '{ for (i = 0; i < NPROC; ++i) print $0 > "file_"i".csv" }'
#copy the data but the header for each file part
tail --silent -n+2 $1* | awk -v NPROC=$(nproc) '{ part = NR % NPROC; print $0 >> "file_"part".csv" }'
其中$1 是文件的版本,作为参数传递给bash 脚本,例如v1 或v2。
输出文件名不相关,目前file_"i".csv & file_"part".csv 产生相同的文件名,其中part & i 位于此范围内:(0, NPROC)
文件v1_2020.csv的一些示例(分号分隔)
DATE;COLOUR;CLOSING;CHANGE;Y
2020-01-02;r;n;4;119
2020-01-02;y;n;56;130
2020-01-03;y;n;3;153
2020-01-03;r;n;46;192
2020-01-03;b;n;20;241
2020-01-04;w;n;1252;252
2020-01-05;w;n;453;253
2020-01-06;b;y;1;279
2020-01-06;b;n;945;294
表格看起来像这样:
| DATE | COLOUR | CLOSING | CHANGE |
|---|---|---|---|
| 2020-01-02 | r | n | 4 |
| 2020-01-02 | y | n | 56 |
| 2020-01-03 | y | n | 3 |
| 2020-01-03 | r | n | 46 |
| 2020-01-03 | b | n | 20 |
| 2020-01-03 | w | n | 1252 |
| 2020-01-05 | w | n | 453 |
| 2020-01-06 | b | y | 1 |
| 2020-01-06 | b | n | 945 |
我想改进这种划分方式,使其不会在相同的日期分成不同的文件。所以它应该考虑到 CSV 文件中的DATE 列。
电流输出与NPROC=2:
file_1.csv
DATE;COLOUR;CLOSING;CHANGE;Y
2020-01-02;r;n;4;119
2020-01-03;y;n;3;153
2020-01-03;b;n;20;241
2020-01-05;w;n;453;253
2020-01-06;b;n;945;294
file_2.csv
DATE;COLOUR;CLOSING;CHANGE;Y
2020-01-02;y;n;56;130
2020-01-03;r;n;46;192
2020-01-04;w;n;1252;252
2020-01-06;b;y;1;279
带有NPROC=2的新输出:
任何类型的不均匀拆分为NPROC 的文件数量,这样它就不会将日期混入不同的文件中。
一个日期应该只在一个文件中,但一个文件应该包含多个日期。
例如,如果符合上述条件,任何其他类型的文件拆分为NPROC 数量的文件都可以:
file_1.csv
DATE;COLOUR;CLOSING;CHANGE;Y
2020-01-02;r;n;4;119
2020-01-02;y;n;56;130
2020-01-03;y;n;3;153
2020-01-03;r;n;46;192
2020-01-03;b;n;20;241
file_2.csv
DATE;COLOUR;CLOSING;CHANGE;Y
2020-01-04;w;n;1252;252
2020-01-05;w;n;453;253
2020-01-06;b;y;1;279
2020-01-06;b;n;945;294
您能否给我任何关于不使用 Python 而只使用 bash 脚本的可能解决方案的提示?
【问题讨论】:
-
它们是分号格式的@TedLyngmo
-
edit 您的问题是将这些图形表替换为您生成它们的原始 CSV,以便我们可以复制/粘贴这些文件来测试潜在的解决方案,以便我们为您提供帮助。跨度>