BASH: 根据公共字段名称加入 2 个 CSV 文件
BASH: Joining 2 CSV files based on common field name
我有 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==FNR{a[[=14=]]=[=14=];next} ( in a){print a[]"," > "file_3.csv"}' file_1.csv file_2.csv
虽然 file_3.csv
已创建,但它是一个空文件。
关于如何做到这一点有什么想法吗?
谢谢!
下面的 join
命令应该可以解决问题:
join --header -t',' -j 1 file_2.csv file_1.csv
只需确保您的 CSV 文件在连接字段上排序即可;有
track_id
因为每个文件中的第一个字段使这很容易。
您应该在这两个文件中使用测试数据,当您对命令执行您想要的操作感到满意时,您可以 运行 它针对实际数据并将其输出重定向到 file_3.csv
。
只要文件已排序,加入就应该有效。尝试:
join -t, <(sort -t, -k1 file_2.csv) <(sort -t, -k1 file_1.csv) > file3.csv
用awk
awk -F, 'NR==FNR{a[]=substr([=10=],length()+2);next} ( in a){print [=10=]","a[]}' 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
我有 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==FNR{a[[=14=]]=[=14=];next} ( in a){print a[]"," > "file_3.csv"}' file_1.csv file_2.csv
虽然 file_3.csv
已创建,但它是一个空文件。
关于如何做到这一点有什么想法吗?
谢谢!
下面的 join
命令应该可以解决问题:
join --header -t',' -j 1 file_2.csv file_1.csv
只需确保您的 CSV 文件在连接字段上排序即可;有
track_id
因为每个文件中的第一个字段使这很容易。
您应该在这两个文件中使用测试数据,当您对命令执行您想要的操作感到满意时,您可以 运行 它针对实际数据并将其输出重定向到 file_3.csv
。
只要文件已排序,加入就应该有效。尝试:
join -t, <(sort -t, -k1 file_2.csv) <(sort -t, -k1 file_1.csv) > file3.csv
用awk
awk -F, 'NR==FNR{a[]=substr([=10=],length()+2);next} ( in a){print [=10=]","a[]}' 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