首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按列合并csv文件,并包含文件名中的时间戳

按列合并csv文件,并包含文件名中的时间戳
EN

Stack Overflow用户
提问于 2019-03-16 01:31:18
回答 1查看 69关注 0票数 2

我有500个csv文件要加入

我将首先解释csv格式,每个csv文件都被命名为log-yyyy-mm-dd.hh:mm:ss.csv

它的结构没有列标题

代码语言:javascript
复制
eventID,number

举个例子

代码语言:javascript
复制
FLAGS-2,16
DOOR6-234,800

我想这样格式化这个数据

代码语言:javascript
复制
eventID,filename,filename,filename  ---and so on for the 500+ files

代码语言:javascript
复制
eventID,log-2019-03-10.21:00:01.csv,log-2019-03-15.12:00:01.csv
FLAGS-2,16,54
FLAGS-3,16,9

我最初考虑使用bash和awk来做这件事,但当我发现偶尔会有数据没有记录在文件中时,我放弃了。它不会存储该eventID编号

当我使用find . -name '*.csv' | xargs wc -l

有些文件有7803行,有些文件有7800行,以此类推

因此,在一个文件中,我可以包含以下内容

代码语言:javascript
复制
FLAGS-2,16
FLAGS-3,19
FLAGS-4,02

下一步

代码语言:javascript
复制
FLAGS-2,16
FLAGS-4,02

下一个最好的方法是什么?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-16 03:37:41

这里有一个bash/awk解决方案,尽管不是最有效的方法。但它足够清晰,易于理解和维护。

基本上,它首先创建标题行和joined.csv文件。然后有一个循环,用于查找所有csv文件中的所有唯一ids。然后在每个csv文件中查找每个key,并将值附加到line。最后将每个line附加到生成的joined.csv文件。

代码语言:javascript
复制
#!/bin/bash

header=eventID
for csv_file in $( ls -1 log*csv)
do
    header="$header,$csv_file"
done
echo $header > joined.csv

for key in $( awk -F, '{print $1}' log*csv | sort -u )
do
    line=$key
    for csv_file in $( ls -1 log*csv)
    do
        value=$( grep $key $csv_file | awk -F, '{print $2}' )
        line="$line,$value"
    done
    echo $line >> joined.csv
done

希望这能有所帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55187953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档