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

时间:2014-12-02 16:04:22

标签: linux unix

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

我有两个包含数十万条记录的csv文件。样本如下:

name,Direction,Date
abc,sent,Jan 21 2014 02:06 
xyz,sent,Nov 21 2014 01:09
pqr,sent,Oct 21 2014 03:06  

name,Direction,Date
abc,received,Jan 22 2014 02:06
xyz,received,Nov 22 2014 02:06

所以,这第二个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

需要根据column1中的匹配数据添加列(第4列和第5列)。如果第二个文件中没有匹配的数据,则列应为空,如上所述。

所以在linux中有一个bash命令来实现这个目的吗?

2 个答案:

答案 0 :(得分:3)

awk可能适合你:

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

更新

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

答案 1 :(得分:3)

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

join -1 1 -2 1 -t, -a 1  1.csv 2.csv | sed "s/Direction,Date/currentDirection,receivedDate/2"

输出:

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,如果需要,您还可以附加-a 2

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