我有几个大的CSV文件(每个约20 MiB)包含如下信息。
我想找到一种方法,根据第一列中的日期将此文件分成较小的文件。例如:以下细分将分为2个文件,即20130719.csv
和20130720.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
答案 0 :(得分:2)
这是一个简化的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可能是更好的选择,具体取决于行的排序方式
答案 1 :(得分:0)
'csplit'几乎可以满足你的需要,但是你需要知道日期范围来编写要分割的正则表达式(如果沿着这条路线走,你可以很容易地用'head'和'tail'来获取它们。如果你不知道他们还有awk单行:
{ print $0 > gensub(/\//, ".", "g", $1) ".csv"; }
将整行$ 0放入名为$ 1.csv的文件中。如果您的日期以特殊字符的滑稽方式指定,您可能需要按摩它以适合您的操作系统。 'gensub'用点替换正斜杠。
关于颜色标签的排序:你有shell实用程序'sort -k4,4'来指定你只想对第四个字段进行排序,但你得到的字母顺序可能不是你想要的。然后再次'awk',虽然我发现用awk的动态数组排序(你将所有行转储到一个数组中,然后在END规则中调用'asort')并不是闪电般的。