首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据匹配行合并两个csv文件,并在linux中添加新列

根据匹配行合并两个csv文件,并在linux中添加新列
EN

Stack Overflow用户
提问于 2014-12-02 16:04:22
回答 2查看 5.5K关注 0票数 4

我正在使用java开发一个应用程序,但为此,我需要一个顺序的csv文件。我不太了解linux,但我想知道是否有某种方法可以以所需的格式合并csv文件。

我有两个csv文件,里面有数十万条记录。样本如下:

代码语言:javascript
复制
name,Direction,Date
abc,sent,Jan 21 2014 02:06 
xyz,sent,Nov 21 2014 01:09
pqr,sent,Oct 21 2014 03:06  

代码语言:javascript
复制
name,Direction,Date
abc,received,Jan 22 2014 02:06
xyz,received,Nov 22 2014 02:06

因此,第二个csv文件将包含文件1的一些记录。

代码语言:javascript
复制
name,Direction,Date,currentDirection,receivedDate
abc,sent,Jan 21 2014 02:06,received,Jan 22 2014 02:06
xyz,sent,Nov 21 2014 01:09,received,Nov 22 2014 02:06
pqr,sent,Oct 21 2014 03:06

需要根据column1中的匹配数据添加列(第4列和第5列)。如果第二个文件中没有匹配的数据,那么列应该是空的,如上面所示。

那么linux中是否有bash命令来实现这一点呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-02 16:13:41

awk可能会为你工作:

代码语言:javascript
复制
kent$  awk -F, -v OFS="," 
       'BEGIN{print "name,Direction,Date,currentDirection,receivedDate"}
        NR==FNR&&NR>1{a[$1]=$0;next}
        FNR>1{printf "%s%s\n",$0,($1 in a?FS a[$1]:"")}' 2.csv 1.csv
name,Direction,Date,currentDirection,receivedDate
abc,sent,Jan 21 2014 02:06,abc,received,Jan 22 2014 02:06
xyz,sent,Nov 21 2014 01:09,xyz,received,Nov 22 2014 02:06
pqr,sent,Oct 21 2014 03:06

更新

代码语言:javascript
复制
kent$  awk -F, -v OFS="," 'BEGIN{print "name,Direction,Date,currentDirection,receivedDate"}
        NR==FNR&&NR>1{a[$1]=$2 FS $3;next}
        FNR>1{printf "%s%s\n",$0,($1 in a?FS a[$1]:"")}' 2.csv 1.csv 
name,Direction,Date,currentDirection,receivedDate
abc,sent,Jan 21 2014 02:06,received,Jan 22 2014 02:06
xyz,sent,Nov 21 2014 01:09,received,Nov 22 2014 02:06
pqr,sent,Oct 21 2014 03:06
票数 4
EN

Stack Overflow用户

发布于 2014-12-02 16:24:17

您可以使用这个join命令来完成这个任务。第一个文件是1.csv,第二个文件是2.csv

代码语言:javascript
复制
join -1 1 -2 1 -t, -a 1  1.csv 2.csv | sed "s/Direction,Date/currentDirection,receivedDate/2"

输出:

代码语言:javascript
复制
name,Direction,Date,currentDirection,receivedDate
abc,sent,Jan 21 2014 02:06,received,Jan 22 2014 02:06
xyz,sent,Nov 21 2014 01:09,received,Nov 22 2014 02:06
pqr,sent,Oct 21 2014 03:06 

解释:

您希望在两个文件中的第一个字段上加入,因此-1 1 -2 1

您希望使用逗号,因此使用-t,

您希望在文件1中显示所有不匹配的记录,因此,如果需要,还可以追加-a 1

sed命令中的/2告诉sed替换第二次出现

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27253776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档