在Bash中加入csv,其中一个表中的键被多次使用

在Bash中加入csv,其中一个表中的键被多次使用,bash,csv,join,merge,Bash,Csv,Join,Merge,我有一个csv,其中一个标识符多次出现,另一个csv包含该标识符的信息。我想为每行将第二个csv中的列附加到第一个csv中 data1.csv +---+---------------------+--------+ | ID| DATE | AMOUNT | +---+---------------------+--------+ | 1 | 2019-09-08 00:00:00 | 3000 | | 1 | 2019-10-08 00:00:00 |

我有一个csv,其中一个标识符多次出现,另一个csv包含该标识符的信息。我想为每行将第二个csv中的列附加到第一个csv中

data1.csv
+---+---------------------+--------+
| ID| DATE                | AMOUNT |
+---+---------------------+--------+
| 1 | 2019-09-08 00:00:00 |   3000 |
| 1 | 2019-10-08 00:00:00 |   1500 |
| 1 | 2019-11-20 00:00:00 |   1560 |
| 2 | 2008-05-20 00:00:00 |   2060 |
+-----+---------------------+------+

data2.csv
+----+----------+-----+-----------+
| ID | NAME     | AGE | Location  | 
+----+----------+-----+-----------+
|  1 | J. Smith |  32 | New York  |
|  2 | A. Jones |  25 | Chicago   |
+----+----------+-----+-----------+
我想创造

+---+---------------------+--------+----------+-----+-----------+
| ID| DATE                | AMOUNT | NAME     | AGE | Location  | 
+---+---------------------+--------+----------+-----+-----------+
| 1 | 2019-09-08 00:00:00 |   3000 | J. Smith |  32 | New York  |
| 1 | 2019-10-08 00:00:00 |   1500 | J. Smith |  32 | New York  |
| 1 | 2019-11-20 00:00:00 |   1560 | J. Smith |  32 | New York  |
| 2 | 2008-05-20 00:00:00 |   2060 | A. Jones |  25 | Chicago   |
+-----+---------------------+------+----------+-----+-----------+
如果可能的话,我正试图在native bash中实现这一点——一些用户将在Windows中使用Cygwin,如果他们没有正确设置Python,那么尝试运行Python将是一团混乱。通常,我只会用熊猫

到目前为止,我所能找到的所有东西都期望CSV能够被排序,并且每个CSV都能够匹配。我可以想象创建一个循环,在data1中查找每个ID,在data2中查找它,然后通过awk组合它们,但是这个数据集将有很多重复,看起来这是一种非常低效的方法


似乎应该有一种现有的方法在可重复键上进行左连接,但我什么也没看到。任何帮助都将不胜感激。

如果您有2个csv文件,有多种方法可以使用,否则可能会变得很棘手。当然,这些解决方案包括awk、sort等

然而,最有效和最简单的方法是使用csvkit。首先安装csvkit:
sudopip安装csvkit
(您需要安装python3和python3pip)

套件中有各种工具,如csvcut、csvlook,它们允许查看和剪切您感兴趣的列。但是对于您的情况,
csvjoin
是一个有效的工具

csvjoin-c 1 file1.csv file2.csv
此命令将列1上的两个文件连接起来

以下是有关这方面的更多信息:

这是我对一个稍有不同的问题的回答,你可能会觉得有用

如果你有两个csv文件,有多种方法可以实现,否则可能会很棘手。当然,这些解决方案包括awk、sort等

然而,最有效和最简单的方法是使用csvkit。首先安装csvkit:
sudopip安装csvkit
(您需要安装python3和python3pip)

套件中有各种工具,如csvcut、csvlook,它们允许查看和剪切您感兴趣的列。但是对于您的情况,
csvjoin
是一个有效的工具

csvjoin-c 1 file1.csv file2.csv
此命令将列1上的两个文件连接起来

以下是有关这方面的更多信息:

这是我对一个稍有不同的问题的回答,你可能会觉得有用

对于大型数据/文件集,shell解决方案的速度可能会很慢,但现在就是这样

data1.csv及其内容

ID,DATE,AMOUNT
1,2019-09-08 00:00:00,3000
1,2019-10-08 00:00:00,1500
1,2019-11-20 00:00:00,1560
2,2008-05-20 00:00:00,2060
ID,NAME,AGE,Location
1,J. Smith,32,New York
2,A. Jones,25,Chicago
data2.csv及其内容

ID,DATE,AMOUNT
1,2019-09-08 00:00:00,3000
1,2019-10-08 00:00:00,1500
1,2019-11-20 00:00:00,1560
2,2008-05-20 00:00:00,2060
ID,NAME,AGE,Location
1,J. Smith,32,New York
2,A. Jones,25,Chicago

剧本

#/usr/bin/env bash
IFS=读取-r数据1\u头done 9<对于大型数据/文件集,shell解决方案的速度会很慢,但在这里就是这样

data1.csv及其内容

ID,DATE,AMOUNT
1,2019-09-08 00:00:00,3000
1,2019-10-08 00:00:00,1500
1,2019-11-20 00:00:00,1560
2,2008-05-20 00:00:00,2060
ID,NAME,AGE,Location
1,J. Smith,32,New York
2,A. Jones,25,Chicago
data2.csv及其内容

ID,DATE,AMOUNT
1,2019-09-08 00:00:00,3000
1,2019-10-08 00:00:00,1500
1,2019-11-20 00:00:00,1560
2,2008-05-20 00:00:00,2060
ID,NAME,AGE,Location
1,J. Smith,32,New York
2,A. Jones,25,Chicago

剧本

#/usr/bin/env bash
IFS=读取-r数据1\u头完成9<在*nix land中有一个
join
实用程序。您确实需要按照要加入的键对YRU数据进行排序,但这应该不是什么大问题。如果需要,您可以将输出后处理回其他排序。在这里搜索
[linux][sort][join]
,应该很容易。我建议您使用您发布的示例数据,并将输出发送到终端。这将是调试任何问题的最快方法。一旦您了解了它的工作原理,请尝试使用更大的文件,并通过
..>joinedOutput.txt
保存输出。祝你好运。你的实际文件包括那些ascii艺术表格吗?如果是的话,它们不是CSV,处理噪音需要做很多工作……它们是普通的CSV文件。我从另一篇关于SQL表的文章中盗取了ascii艺术,因为我认为它比CSV的一串列更容易看到*nix land中有一个
join
实用程序。您确实需要按照要加入的键对YRU数据进行排序,但这应该不是什么大问题。如果需要,您可以将输出后处理回其他排序。在这里搜索
[linux][sort][join]
,应该很容易。我建议您使用您发布的示例数据,并将输出发送到终端。这将是调试任何问题的最快方法。一旦您了解了它的工作原理,请尝试使用更大的文件,并通过
..>joinedOutput.txt
保存输出。祝你好运。你的实际文件包括那些ascii艺术表格吗?如果是的话,它们不是CSV,处理噪音需要做很多工作……它们是普通的CSV文件。我偷了另一篇关于SQL表的文章中的ascii艺术,因为我认为它比一堆csv列更容易看到