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

时间:2017-06-08 19:29:26

标签: shell csv awk

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

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

use N
SELECT   id, 
         type, 
         NAME, 
         log_time , 
         start_time , 
         documents_created , 
         pages_created, 
         processed, 
         processed_time  

FROM     N_LF_OCR_LOG 

WHERE    

    -- Log time is current day
    log_time between  CONVERT(date, getdate()) AND CONVERT(datetime,floor(CONVERT(float,getdate()))) + '23:59:00'  

    -- Documents created is NULL or non zero
    AND (documents_created IS NULL OR documents_created <> 0)

  or  ( documents_created is null and log_time between  CONVERT(date, getdate()) AND CONVERT(datetime,floor(CONVERT(float,getdate()))) + '23:59:00')  

    -- Filter for specific types
    AND type IN ('Email OCR In', 
            'Universal Production') 

    -- Filter to rows where number of pages and documents created are not equal
    AND documents_created <2 and pages_created >2 

ORDER BY log_time
,id asc 
,processed_time asc

和ZBND22V.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

输出文件名RPKM_all.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

找不到相应的值时添加0。

2 个答案:

答案 0 :(得分:1)

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

免责声明:只有当数据能够适合内存时,订单才会丢失,但是如果重要,有办法处理它。

解释从概念上创建一个表(也就是二维数组,矩阵)并填写条目。行按键和列按文件编号索引。由于awk数组正在对键进行哈希处理,因此我们将标题分开处理以保持原位。 a[k,i]+0是将缺失的元素转换为0

答案 1 :(得分: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