Linux – join2个CSV文件

我有2个CSV文件:

file_1 columns: id,user_id,message_id,rate file_2 columns: id,type,timestamp 

文件之间的关系是file_1.message_id = files_2.id

我想创build一个第三个文件,它将包含以下列:

 file_1.id,file_1.user_id,file_1.message_id,file_1.rate,file_2.timestamp 

任何想法如何在Linux中做到这一点?

Solutions Collecting From Web of "Linux – join2个CSV文件"

你可以像这样使用join命令:

 join -t, -1 3 -2 1 -o 1.1 1.2 1.3 1.4 2.3 <(sort file1) <(sort file2) 

它首先对文件进行排序,然后使用file1的第三个字段和file2的第一个字段将它们连接起来。 然后输出你需要的字段。

似乎是SQLite的工作。 使用SQLite shell :

  create table f1(id,user_id,message_id,rate); create table f2(id,type,timestamp); .separator , .import 'file_1.txt' f1 .import 'file_2.txt' f2 CREATE INDEX i1 ON f1(message_id ASC); -- optional CREATE INDEX i2 ON f2(id ASC); -- optional .output 'output.txt' .separator , SELECT f1.id, f1.user_id, f1.message_id, f1.rate, f2.timestamp FROM f1 JOIN f2 ON f2.id = f1.message_id; .output stdout .q 

请注意,如果一行中逗号数量出现单个错误,则导入阶段将失败。 您可以防止脚本的其余部分在脚本开始处使用.bail on运行。

如果你想要无与伦比的ID,你可以尝试:

 SELECT f1.* FROM f1 LEFT JOIN f2 on f2.id = f1.message_id WHERE f2.id IS NULL 

这将选择f1中没有找到相应的行中的每一行。

你可以试试这个:
1.将所有行更改为以键开头:

 awk -F',' { print $3 " file1 " $1 " " $2 " " $4 } < file1 > temp awk -F',' { print $1 " file2 " $2 " " $3 } < file2 >> temp 

现在线条看起来像:

 message_id file1 id user_id rate id file2 type timestamp 
  1. 按前两列对temp进行排序。 现在相关的行是相邻的,首先是file1

    sort -k 1,1 -k 2,2 < temp > temp2

  2. 运行awk来读取行。 在file1行中保存字段,在file2行中打印它们。

awk你可以尝试这样的事情 –

 awk -F, 'NR==FNR{a[$3]=$0;next} ($1 in a){print a[$1]","$3 > "file_3"}' file_1 file_2 

测试:

 [jaypal:~/Temp] cat file_1 # Contents of File_1 id,user_id,message_id,rate 1,3334,424,44 [jaypal:~/Temp] cat file_2 # Contents of File_2 id,type,timestamp 424,rr,22222 [jaypal:~/Temp] awk -F, 'NR==FNR{a[$3]=$0;next} ($1 in a){print a[$1]","$3 > "file_3"}' file_1 file_2 [jaypal:~/Temp] cat file_3 # Contents of File_3 made by the script 1,3334,424,44,22222