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

时间:2019-03-15 17:31:18

标签: bash csv

我有500个要加入的CSV文件

我将首先解释csv格式,每个csv文件的名称分别为log-yyyy-mm-dd.hh:mm:ss.csv

其结构没有列标题

eventID,number

例如

FLAGS-2,16
DOOR6-234,800

我想这样格式化数据

eventID,filename,filename,filename  ---and so on for the 500+ files

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行,依此类推

所以在一个文件中,我可以拥有以下内容

FLAGS-2,16
FLAGS-3,19
FLAGS-4,02

和下一个

FLAGS-2,16
FLAGS-4,02

什么是下一个最佳方法

谢谢

1 个答案:

答案 0 :(得分:1)

这是一个bash / awk解决方案,尽管不是最有效的方法。但是很容易理解和维护。

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

#!/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

希望这会有所帮助!