Linux - 加入2个CSV文件

Ran*_*Ran 10 linux csv join

我有2个CSV文件:

file_1 columns: id,user_id,message_id,rate
file_2 columns: id,type,timestamp
Run Code Online (Sandbox Code Playgroud)

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

我想创建一个包含以下列的第3个文件:

file_1.id,file_1.user_id,file_1.message_id,file_1.rate,file_2.timestamp
Run Code Online (Sandbox Code Playgroud)

有关如何在Linux中执行此操作的任何想法?

dog*_*ane 10

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

join -t, -1 3 -2 1 -o 1.1 1.2 1.3 1.4 2.3 <(sort -t, -k 3,3 file1) <(sort file2)
Run Code Online (Sandbox Code Playgroud)

它首先对文件file1进行排序(按第3个字段排序),然后使用第3个字段file1和第1个字段连接它们file2.然后输出您需要的字段.

  • 这可能应该更改为以下命令...`join -t -1 3 -2 1 -o 1.1 1.2 1.3 1.4 2.3 <(sort -t $',' - k 3,3 file1)<(sort file2) `以便按正确的连接键排序 (2认同)

Ben*_*oit 4

似乎是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
Run Code Online (Sandbox Code Playgroud)

请注意,如果单行中的逗号数量存在单个错误,则导入阶段将失败。.bail on您可以在脚本开头阻止脚本的其余部分运行。

如果你想要不匹配的 id,你可以尝试:

SELECT f1.* FROM f1 LEFT JOIN f2 on f2.id = f1.message_id WHERE f2.id IS NULL
Run Code Online (Sandbox Code Playgroud)

这将选择未找到f1相应行的每一行。f2