根据列合并多个CSV文件

时间:2019-02-19 14:58:37

标签: python linux bash perl awk

我有以下3个CSV文件。我想基于列合并它们。 前两列的组合将是唯一标识符。

我对任何脚本语言都可以,但是性能应该不错。

文件1:

enter image description here

文件2:

enter image description here

文件3:

enter image description here

输出:

enter image description here

以文本格式输出以进行测试:

abc,xxx,a1,b1,c1,p1,q1,r1,x3,y3,z3

abc,yyy,a2,b2,c2,p2,q2,r2,x4,y4,z4

def,zzz,a3,b3,c3,p3,q3,r3,x1,y1,z1

def,pqr,a4,b4,c4,p4,q4,r4,x2,y2,z2

4 个答案:

答案 0 :(得分:1)

将第一个文件读入哈希(Python称为dict),并以前两列的组合为键

将第二个文件读取到相同的哈希中,该哈希也由前两列的组合作为键。您将需要决定如何合并同一列的变体数据

重复第3个文件。

Text::CSV是您的朋友在这里。...

答案 1 :(得分:0)

查看熊猫库。 .merge应该会为您提供所需的信息,但是由于您尚未发布任何代码,因此很难说。无论如何:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html

答案 2 :(得分:0)

由于缺少可用的测试数据而完全未经测试,并且图像中的内容与关于唯一键的数据描述不匹配,但是由于合并多个表基本上是数据库问题,因此以下是使用sqlite执行的脚本所有繁重的工作:

#!/bin/sh
# Usage: ./join.sh filea.csv fileb.csv filec.csv

filea=$1
fileb=$2
filec=$3

sqlite3 -batch -noheader -csv <<EOF
CREATE TABLE a(element, identifier, a1, a2, a3
             , PRIMARY KEY(element, identifier)) WITHOUT ROWID;
CREATE TABLE b(element, identifier, b1, b2, b3
             , PRIMARY KEY(element, identifier)) WITHOUT ROWID;
CREATE TABLE c(element, identifier, c1, c2, c3
             , PRIMARY KEY(element, identifier)) WITHOUT ROWID;
.import "$filea" a
.import "$fileb" b
.import "$filec" c
SELECT a.element, a.identifier, a1, a2, a3, b1, b2, b3, c1, c2, c3
FROM a
JOIN b ON a.element = b.element AND a.identifier = b.identifier
JOIN c ON a.element = c.element AND a.identifier = c.identifier
ORDER BY a.element, a.identifier;
EOF

(附注:伙计,我希望join(1)支持多字段键)

答案 3 :(得分:-1)

使用所提供的信息,以下代码将为您工作:

cat file1.csv file2.csv file3.csv | awk -F, '![$1$2]++' > out_file.csv

-如果任何文件中的两列以上,则与唯一标识符的首次出现相对应的数据(即前两列的组合)将出现在输出文件中。