【问题标题】:Separate one large CSV file in smaller files based on the first column in bash根据 bash 中的第一列将一个大的 CSV 文件分隔为较小的文件
【发布时间】:2013-10-01 22:05:29
【问题描述】:

我有几个包含以下信息的大型 CSV 文件(每个约 20 MiB)。 我想找到一种方法,根据第一列中的日期将此文件分成较小的文件。例如:下面的segment会被分成2个文件,分别是20130719.csv20130720.csv

我还想根据第 4 列(颜色标签)进行排序(在每个较小的文件中)。 有人对我如何做到这一点有任何建议吗?

在处理这些类型的事情时,我应该学习什么?

19/07/2013  19:14:24:523    6.35099E+17 Dr_Blue 10.42496014 27.17010689 0.685520172
19/07/2013  19:18:5:903 6.35099E+17 Dr_Yellow   11.09363079 28.57788467 2.010284424
19/07/2013  19:36:33:645    6.35099E+17 Dr_Blue 10.77513885 28.3723774  1.897870064
19/07/2013  21:29:36:762    6.35099E+17 Dr_Yellow   10.64018059 28.56962967 1.117245913
19/07/2013  21:29:37:627    6.35099E+17 Dr_Yellow   11.3354435  27.57170868 1.552354813
20/07/2013  2:34:28:2   6.35099E+17 Dr_Yellow   10.41067123 26.84050369 0.919301987
20/07/2013  2:34:28:840 6.35099E+17 Dr_Yellow   10.54369164 27.17712402 0.573934555
20/07/2013  2:34:33:192 6.35099E+17 Dr_Yellow   10.98471832 28.35677719 1.497600555
20/07/2013  4:20:28:246 6.35099E+17 Dr_Blue 10.92816448 28.55761147 2.187088013

【问题讨论】:

  • 你应该学习/检查的事情:确保你有 2-3 x 可用磁盘空间? ;-) 祝你好运。
  • man awkman sort

标签: linux bash csv command-line-interface


【解决方案1】:

这是一个简化的shell版本

IFS="$IFS/"
while read DAY MO YR A B C D E F || [ "$DAY" ]; do
  echo "$A $B $C $D $E $F" >> "$YR$MO$DAY.ssv"
done <infile

for x in *.ssv; do
  sort -k4 $x |tr " " "," > ${x%.ssv}.csv
  rm $x
done

对于动态排序,根据行的排序方式,awk 可能是更好的选择

【讨论】:

    【解决方案2】:

    'csplit' 几乎可以满足您的需求,但您需要知道编写正则表达式以进行拆分的日期范围(如果您沿着这条路线走,您可以使用 'head' 和 'tail' 轻松获得它们。如果您不知道他们还有 awk one-liner:

    { print $0 > gensub(/\//, ".", "g", $1) ".csv"; }
    

    将整行 $0 放入名为 $1.csv 的文件中。如果您的日期是用特殊字符以有趣的方式指定的,您可能需要对其进行按摩以使您的操作系统可以接受。 'gensub' 用点替换正斜杠。

    至于按颜色标签排序:您可以使用 shell 实用程序“sort -k4,4”指定您只想对第四个字段进行排序,但您得到的字母顺序可能不是您想要的。然后又是 'awk',虽然我发现使用 awk 的动态数组进行排序(将所有行转储到一个数组中,然后在 END 规则中对其调用 'asort')并不快。

    【讨论】:

    • 请注意,$1 值包含斜杠,因此您确实需要处理 $1 中的值以创建正确的文件名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 2019-09-23
    相关资源
    最近更新 更多