合并多个文件:第1列(相同字符串),第2列(每个文件的唯一值)

时间:2014-07-22 04:26:35

标签: python bash awk merge

我有多个文件(* .csv)有一个公共列(“Common_Title”)和相应的值(“Value#”),我需要将它们合并到一个摘要文件中。

一个困难的部分是我需要将所有值传递到摘要文件,但是单个文件有时缺少某个“Common_Title”,因此需要在其“Value#”位置放置“0000”。

这是3个示例文件,都有点不同

# File1.csv

Common_Title,Value1
AAAAA,1111
BBBBB,1111
CCCCC,1111

# File2.csv

Common_Title,Value2
AAAAA,2222
BBBBB,2222
DDDDD,2222
EEEEE,2222

# File3.csv

Common_Title,Value3
AAAAA,3333
BBBBB,3333
CCCCC,3333
EEEEE,3333

我想合并到这个摘要文件

# MergedFiles123.csv

Common_Title,Value1,Value2,Value3
AAAAA,1111,2222,3333
BBBBB,1111,2222,3333
CCCCC,1111,0000,3333
DDDDD,0000,2222,0000
EEEEE,0000,2222,3333

1 个答案:

答案 0 :(得分:1)

使用awk:

awk -F, '!a[$1]++ { keys[++i] = $1 } !r[FILENAME]++ { ++argind } { b[$1, argind] = $2 } END { for (i = 1; i in keys; ++i) { k = keys[i]; t = k; for (j = 1; j <= argind; ++j) t = t FS (length(b[k, j]) ? b[k, j] : "0000"); print t } }' file1 file2 file3

输出:

Common_Title,Value1,Value2,Value3
AAAAA,1111,2222,3333
BBBBB,1111,2222,3333
CCCCC,1111,0000,3333
DDDDD,0000,2222,0000
EEEEE,0000,2222,3333

评论:

  • !a[$1]++ { keys[++i] = $1 }条件!a[$1]++,阻止({})只能评估首次遇到$1的时间。在块内,键($1)将被添加到keys数组一次。
  • !r[FILENAME]++ { ++argind }每次遇到新文件时递增计数器argind
  • { b[$1, argind] = $2 }参考key和当前文件的索引argind存储数据。
  • END { for (i = 1; i in keys; ++i) { k = keys[i]; t = k; for (j = 1; j <= argind; ++j) t = t FS (length(b[k, j]) ? b[k, j] : "0000"); print t } }'处理完所有文件后运行。它按顺序遍历keys中的每个键;并将基于该密钥的所有数据打印为单行,该行取自b[]并包含对索引的引用。