首页 > 解决方案 > Bash 命令对具有不同时间序列行的两个 csv 文件进行列合并

问题描述

我有两个包含时间序列数据的 csv 文件,我想使用 bash 对它们进行列合并。合并部分很简单paste -d , file1.csv file2.csv > combined.csv,会生成一个包含额外列的合并文件。

问题是每个文件中的时间序列数据没有对齐,我希望能够处理这种情况。因此,合并的行由 A 列中的时间戳对齐。

这个SO Question中描述了同样的问题。但这与 R 编程语言有关,因此答案不适用于 bash。

# File 1                                      # File 2
| Time                 | Datapoint |          | Time                 | Datapoint |
| 2021-04-01T00:00:00Z | 43        |          | 2021-04-01T00:00:05Z | 51        |
| 2021-04-01T00:00:01Z | 44        |          | 2021-04-01T00:00:10Z | 52        |
| 2021-04-01T00:00:02Z | 45        |          | 2021-04-01T00:00:15Z | 53        |
| 2021-04-01T00:00:03Z | 46        |          | 2021-04-01T00:00:20Z | 54        |
| 2021-04-01T00:00:04Z | 47        |          | 2021-04-01T00:00:25Z | 55        |
| 2021-04-01T00:00:05Z | 48        |          | 2021-04-01T00:00:30Z | 56        |
| 2021-04-01T00:00:06Z | 49        |          | 2021-04-01T00:00:35Z | 57        |

# Desired File
| Time                 | Datapoint | Datapoint |
| 2021-04-01T00:00:00Z | 43        |           |
| 2021-04-01T00:00:01Z | 44        |           |
| 2021-04-01T00:00:02Z | 45        |           |
| 2021-04-01T00:00:03Z | 46        |           |
| 2021-04-01T00:00:04Z | 47        |           |
| 2021-04-01T00:00:05Z | 48        | 51        |
| 2021-04-01T00:00:06Z | 49        |           |

我知道我可以编写一个脚本来读取这两个文件,并分别写入与每个时间戳相关的数据。但我想知道是否有另一种使用 bash 实用程序的方法?

标签: bashcsvmergetime-series

解决方案


使用join. 这需要对文件进行排序,但从外观上看,您的文件已经排序。

join --header -t, -j1 -a1 file1 file2印刷

Time                ,Datapoint,Datapoint
2021-04-01T00:00:00Z,43
2021-04-01T00:00:01Z,44
2021-04-01T00:00:02Z,45
2021-04-01T00:00:03Z,46
2021-04-01T00:00:04Z,47
2021-04-01T00:00:05Z,48       ,51
2021-04-01T00:00:06Z,49

推荐阅读