繁体   English   中英

如何使用其中一个的第一列作为索引来合并多个 .csv 文件(shell 脚本)

[英]How to merge multiple .csv files using the 1st column of one of them as a index (shell scripting)

如何使用其中一个的第一列作为索引来合并多个 .csv 文件(pref shell scripting - awk)

88 个看起来像这样的 .csv 文件 输入文件名称为 ZBND19X.csv

==> ZBND19X.csv <==
Gene,ZBND19X(26027342 pairs)
ENSTGUG00000013338 (GAPDH),984.31862471
ENSTGUG00000000915,862.597795025
ENSTGUG00000006651 (ARPP19),845.045872644
ENSTGUG00000005054 (CAMKV),823.404021741
ENSTGUG00000005949 (FTH1),585.628487964

和 ZBND22V.csv

==> ZBND39X.csv <==
Gene,ZBND39X(26558640 pairs)
ENSTGUG00000013338 (GAPDH),971.678203888
ENSTGUG00000005054 (CAMKV),687.81249397
ENSTGUG00000006651 (ARPP19),634.296191033
ENSTGUG00000002582 (ITM2A),613.756010638
ENSTGUG00000000915,588.002298061

输出文件名 RPKM_all.csv

Gene,ZBND19X(26027342 pairs),ZBND39X(26558640 pairs)
ENSTGUG00000013338 (GAPDH),984.31862471,971.678203888
ENSTGUG00000000915,862.597795025,588.002298061
ENSTGUG00000006651 (ARPP19),845.045872644,634.296191033
ENSTGUG00000005054 (CAMKV),823.404021741,687.81249397
ENSTGUG00000005949 (FTH1),585.628487964,0
ENSTGUG00000002582 (ITM2A),613.756010638,0

当没有找到对应的值时添加 0。

join一次只能同时处理两个文件

awk解救!

$ awk -F, 'FNR==1 {c++; h=h sep $2; sep=FS; next} 
                  {ks[$1]; a[$1,c]=$2} 
           END    {print h; 
                   for(k in ks) 
                     {printf "%s", k;
                      for(i=1;i<=c;i++) printf "%s", FS a[k,i]+0; 
                      print ""}}' files

免责声明:仅当数据可以容纳在内存中时,顺序也会丢失,但如果重要,则可以使用一些方法来处理。

解释从概念上创建表(aka 2D数组,矩阵)并填充条目。 行由键索引,列由文件编号索引。 由于awk数组对键进行哈希处理,因此我们将标头单独对待以保持原位。 a[k,i]+0将丢失的元素转换为0

简单的答案是“加入”。

只要文件已排序,就可以使用join命令在第一列上进行匹配(默认情况下)。

不要忘记对文件进行排序。

我是否提到过您需要对文件进行排序;)? 这是一个容易犯的错误(我已经使这个错误变得足够多了,因此成为重点)。

sort  ZBND19X.csv >  ZBND19X.csv.sorted
sort ZBND39X.csv  > ZBND39X.csv.sorted
join -t, ZBND19X.csv.sorted ZBND39X.csv.sorted > RPKM_all.csv

在上面运行后,这是RPKM_all.csv的内容:

ENSTGUG00000000915,862.597795025,588.002298061
ENSTGUG00000005054 (CAMKV),823.404021741,687.81249397
ENSTGUG00000006651 (ARPP19),845.045872644,634.296191033
ENSTGUG00000013338 (GAPDH),984.31862471,971.678203888
Gene,ZBND19X(26027342 pairs),ZBND39X(26558640 pairs)

我们还可以查找不匹配的行,如下所示:

$ join -v1 -t, ZBND19X.csv.sorted ZBND39X.csv.sorted | awk -F, -v OFS=, '{print $1,$2,0}'
ENSTGUG00000005949 (FTH1),585.628487964,0

$ join -v2 -t, ZBND19X.csv.sorted ZBND39X.csv.sorted | awk -F, -v OFS=, '{print $1,0,$2}'
ENSTGUG00000002582 (ITM2A),0,613.756010638

现在,您可以结合整个过程:

sort  ZBND19X.csv >  ZBND19X.csv.sorted
sort ZBND39X.csv  > ZBND39X.csv.sorted
join -t, ZBND19X.csv.sorted ZBND39X.csv.sorted > RPKM_all.csv
join -v1 -t, ZBND19X.csv.sorted ZBND39X.csv.sorted | awk -F, -v OFS=, '{print $1,$2,0}' >> RPKM_all.csv
join -v2 -t, ZBND19X.csv.sorted ZBND39X.csv.sorted | awk -F, -v OFS=, '{print $1,0,$2}'  >> RPKM_all.csv

awk 代码(awk -F, 'FNR==1 {c++; h=h sep $2; sep=FS; next} ):有没有人可以对此做更多解释,代码没有正确打印标题,所有标题只是跳转到不同的行,第一个标题也丢失了

P21 P22 P24 P24

AamoA_EU022762 1 1 0 0 AamoA_EU099963 0 1 0 0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM