我正在使用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的一些记录。
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命令来实现这一点呢?
发布于 2014-12-02 16:13:41
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发布于 2014-12-02 16:24:17
您可以使用这个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。
sed命令中的/2告诉sed替换第二次出现
https://stackoverflow.com/questions/27253776
复制相似问题