如何在bash中合并具有相同列值的两个文件

时间:2017-10-02 08:51:04

标签: bash csv merge

我有2个csv文件,这些是他们的内容。

file1(23个字段)

data11,data12,ID1,data14...

data21,data22,ID2,data24...

data31,data32,ID3,data34...

file2(22个字段)

ID1,value12,value13,...

ID1,value22,value23,...

ID1,value32,value33,...

ID2,value42,value43,... 

ID3,value52,value53,...

输出应该是......

输出:

 data11,data12,ID1,data14,...,value12,value13

 data11,data12,ID1,data14,...,value22,value23

 data11,data12,ID1,data14,...,value32,value33

 data21,data22,ID2,data24,...,value42,value43

 data31,data32,ID3,data34,...,value52,value53

有人可以帮助我使用awk或任何bash内置插件来获取此输出吗? 谢谢!

2 个答案:

答案 0 :(得分:0)

抱歉,我的错误是误解你的问题,试试下面的cmd,它应该是你想要的:

for line1 in `cat file1`;do id=`echo $line1|awk -F ',' '{print $3}'`;\
awk -v id=$id -v line1=$line1 -F ',' '($1==id){print line1","$0}' file2;done

此cmd的输出是

data11,data12,ID1,data14...,ID1,value12,value13,...
data11,data12,ID1,data14...,ID1,value22,value23,...
data11,data12,ID1,data14...,ID1,value32,value33,...
data21,data22,ID2,data24...,ID2,value42,value43,... 
data31,data32,ID3,data34...,ID3,value52,value53,...

如果你不想要ID *的重复列,你可以这样做

for line1 in `cat file1`;do id=`echo $line1|awk -F ',' '{print $3}'`;\
awk -v id=$id -v line1=$line1 -F ',' '($1==id){printf "%s",line1;\
for(i=2;i<NF;i++) printf ",%s",$i;print ","$NF}' file2;done

它不会在file2

中打印ID *
data11,data12,ID1,data14...,value12,value13,...
data11,data12,ID1,data14...,value22,value23,...
data11,data12,ID1,data14...,value32,value33,...
data21,data22,ID2,data24...,value42,value43,... 
data31,data32,ID3,data34...,value52,value53,...

----------更新前的错误答案---------

https://www.computerhope.com/unix/upaste.htm HI,

您可以使用paste cmd加入不同文件的相关行

请使用man paste cmd了解详细用法

答案 1 :(得分:0)

您可以使用join ..在-o之后指定输出所需的列顺序,例如:1.1指的是第一个(file1)文件的第一列。还需要对输入文件进行预排序

join -t "," -1 3 -2 1  -o 1.1,1.2,1.3,1.4,2.2,2.3 
<( sort -t "," -k3 /tmp/file1 ) <( sort -t "," -k1 /tmp/file2 )