BASH:根据公共字段名称连接 2 个 CSV 文件

Posted

技术标签:

【中文标题】BASH:根据公共字段名称连接 2 个 CSV 文件【英文标题】:BASH: Joining 2 CSV files based on common field name 【发布时间】:2015-04-29 22:12:03 【问题描述】:

我有 2 个 CSV 文件,我需要使用 BASH 加入它们:

file_1.csv columns: 

track_id    
title
song_id 
release 
artist_id   
artist_mbid 
artist_name 
duration    
artist_familiarity  
artist_hotttnesss
year

Sample date in file_1.csv

TRZZZZZ12903D05E3A,Infra Stellar,SOZPUEF12AF72A9F2A,Archives Vol. 2,ARBG8621187FB54842,4279aba0-1bde-40a9-8fb2-c63d165dc554,Delerium,495.22893,0.69652442519,0.498471038842,2001

file_2.csv columns: 

track_id    
sales_date  
sales_count

Sample data in file_2.csv

TRZZZZZ12903D05E3A,2014-06-19,79

文件之间的关系是file_1.track_id = file_2.track_id

我想创建一个包含以下列的第三个文件file_3.csv

file_2.track_id,file_2.sales_date,file_2.sales_count,file_1.title,file_1.song_id,file_1.release,file_1.artist_id,file_1.artist_mbid,file_1.artist_name,file_1.duration,file_1.artist_familiarity,file_1.artist_hotttnesss,file_1.year

我尝试了以下方法:

join -t',' -1 N -1 N file_2.csv file_1.csv >> file_3.csv

awk -F, 'NR==FNRa[$0]=$0;next ($1 in a)print a[$1]"," > "file_3.csv"' file_1.csv file_2.csv

虽然file_3.csv 已创建,但它是一个空文件。 关于如何做到这一点的任何想法?

谢谢!

【问题讨论】:

【参考方案1】:

下面的join 命令应该可以解决问题:

join --header -t',' -j 1 file_2.csv file_1.csv

只需确保您的 CSV 文件按连接字段排序即可;有 track_id 作为每个文件中的第一个字段使这很容易。

您应该在两个文件中都使用测试数据,当您对命令执行您想要的操作感到满意时,您可以针对实际数据运行它并将其输出重定向到file_3.csv

【讨论】:

【参考方案2】:

只要文件已排序,Join 就应该可以工作。试试:

join -t, <(sort -t, -k1 file_2.csv) <(sort -t, -k1 file_1.csv) > file3.csv

【讨论】:

即使在表格行数不同的情况下(即一个表格的行数比另一个表格多),这也能工作吗?【参考方案3】:

使用 awk

awk -F, 'NR==FNRa[$1]=substr($0,length($1)+2);next ($1 in a)print $0","a[$1]' file_1.csv file_2.csv > file_3.csv

file_3.csv 内容:

TRZZZZZ12903D05E3A,2014-06-19,79,Infra Stellar,SOZPUEF12AF72A9F2A,Archives Vol. 2,ARBG8621187FB54842,4279aba0-1bde-40a9-8fb2-c63d165dc554,Delerium,495.22893,0.69652442519,0.498471038842,2001

【讨论】:

如何使用这种方法保留列标题? @Doug,在此示例中,标题将被保留,因为在两个文件中,第一列的标题都是 track_id。因此它们匹配并且标题行将被打印,就像任何其他匹配第一列的行一样。

以上是关于BASH:根据公共字段名称连接 2 个 CSV 文件的主要内容,如果未能解决你的问题,请参考以下文章

在bash中管理csv文件中读取动态字段的Unix权限

Bash:使用 CSV 文件构建循环并保存结果

BASH - 从 csv 文件的行创建数组,其中第一个条目是数组名称

根据字段名称列选择

在 bash 中使用 ec2 命令行工具获取 ec2 实例的公共 dns 名称

使用 bash 将 .txt 文件连接成 .csv