我正在使用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命令来实现这个目的吗?
答案 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
替换第二次出现