【问题标题】:How to merge two files with the same column value in bash如何在bash中合并具有相同列值的两个文件
【发布时间】:2018-03-13 08:03:45
【问题描述】:

我有 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 内置插件获得此输出? 谢谢!

【问题讨论】:

  • 这是,..., 是否意味着多个中间列?每个文件的字段数是多少?
  • 是的,你是对的。文件 1 有 23 个字段,文件 2 有 22 个字段
  • 你能发布所有字段的输入片段吗?

标签: bash csv merge


【解决方案1】:

对不起,是我误会了你的问题,试试下面的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 嗨,

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

详细使用请使用man pastecmd

【讨论】:

  • 但我认为这个问题更复杂。我想我不能在这里使用 paste cmd,因为有一些列检查。
  • @JaneS。很抱歉误会您的问题,请查看我更新的答案。
【解决方案2】:

您可以使用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 ) 

【讨论】:

  • 但在我的情况下,ID 不是整数。它是一串随机字符。可以加入还支持吗?
  • 是的,我们在这里根据不一定是数字排序的列对两个输入进行排序。尝试使用它并告诉我。准备输入文件可能需要进行一些调整。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 2022-01-11
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
  • 2017-09-28
相关资源
最近更新 更多