【问题标题】:Split CSV and add headers and index column with awk拆分 CSV 并使用 awk 添加标题和索引列
【发布时间】:2018-06-09 11:40:57
【问题描述】:

我正在尝试使用 awk 根据日期将大型 CSV 拆分为较小的文件。尽管它返回“打开的文件过多”错误,但我的基本命令仍在工作。因此,我已阅读以关闭文件,但写入的命令在每个文件仅写入一行后将其关闭。

awk -F' ' '{close($1".csv")}{print > ($1".csv")}' 2015full.csv 

此外,我想为每个拆分文件和一个索引列添加一个标题行。我的数据如下:

2015full.csv

2015-12-24 18:20:57 -87.2788204 36.5984675 0
2015-12-24 18:20:42 -87.2784049 36.597298699999996 0
2015-12-24 18:20:26 -87.274402 36.5932405 0
2015-12-23 18:20:10 -87.25762519999999 36.572330400000006 0
2015-12-23 18:19:40 -87.25762519999999 36.572330400000006 0
2015-12-23 18:19:21 -87.25762519999999 36.572330400000006 0

我正在努力得到:

2015-12-24.csv

num date time lon lat
1 2015-12-24 18:20:57 -87.2788204 36.5984675
2 2015-12-24 18:20:42 -87.2784049 36.597298699999996
3 2015-12-24 18:20:26 -87.274402 36.5932405

2015-12-23.csv

num date time lon lat
1 2015-12-23 18:20:10 -87.25762519999999 36.572330400000006
2 2015-12-23 18:19:40 -87.25762519999999 36.572330400000006
3 2015-12-23 18:19:21 -87.25762519999999 36.572330400000006

我可能有以下正确的部分:

awk -F' ' 'NR==1{print “num”, $0; “date”, $1; “time”, $2; “lon”, $3; “lat”, $4; next}{print (NR-1), $0}{close($1".csv")}{print > ($1".csv")}' 2015full.csv

但它们的顺序不是为我的目的创建一个工作命令。有人对我有什么建议吗?谢谢!

【问题讨论】:

  • 如果文件已排序,请在到达新日期之前不要关闭文件。如果未排序,请考虑对其进行排序。

标签: bash csv awk


【解决方案1】:

虽然您正在关闭后端的文件,但是当 $1 的值将在那时发生变化时,之前的 $1 的价值 .csv 文件仍将在后端打开,而不是在每一行上关闭它们,尝试关注并让我知道这是否对您有帮助(考虑到您的 Input_file 已按照显示的示例进行排序,如果没有,则我们必须按第一列对其进行排序并将其通过管道传递给 awk 命令)。

awk -F' ' 'prev!=$1{close(prev".csv")}{print > ($1".csv");prev=$1}' 2015full.csv 

编辑:我可以看到您在每个 $1 输出文件中都需要一个标题,如果是这样,那么下面的代码也可以帮助您。

awk -F' ' 'prev!=$1{close(prev".csv");print "num date time lon lat" > ($1".csv")}{print > ($1".csv");prev=$1}' 2015full.csv

【讨论】:

【解决方案2】:
awk '
    BEGIN { hdr = "num" OFS "date" OFS "time" OFS "lon" OFS "lat" }
    $1!=prev { close(out); out=$1".csv"; print hdr > out; idx=0; prev=$1 }
    { print ++idx, $0 > out }
' 2015full.csv

【讨论】:

  • 虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
  • 虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
【解决方案3】:

如果不使用 awk

for i in $(cut -d ' ' -f1 2015full.csv|uniq);do grep -w $i 2015full.csv|nl -w1 -s ' ' |sed "1i num date time lon lat" >$i.csv; done

【讨论】:

    猜你喜欢
    • 2022-07-07
    • 1970-01-01
    • 2013-03-04
    • 2016-09-10
    • 1970-01-01
    • 2019-02-03
    • 2017-03-11
    • 1970-01-01
    • 2018-03-18
    相关资源
    最近更新 更多