我有以下3个CSV文件。我想基于列合并它们。 前两列的组合将是唯一标识符。
我对任何脚本语言都可以,但是性能应该不错。
文件1:
文件2:
文件3:
输出:
以文本格式输出以进行测试:
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
答案 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
-如果任何文件中的两列以上,则与唯一标识符的首次出现相对应的数据(即前两列的组合)将出现在输出文件中。