【问题标题】:Merge multiple files: 1st Column (same string), 2nd Column (unique values per file)合并多个文件:第一列(相同的字符串),第二列(每个文件的唯一值)
【发布时间】:2014-09-12 18:33:48
【问题描述】:

我有多个文件 (*.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

【问题讨论】:

    标签: python bash awk merge


    【解决方案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 &lt;= argind; ++j) t = t FS (length(b[k, j]) ? b[k, j] : "0000"); print t } }' 在处理完所有文件后运行。它按顺序遍历keys 中的每个键;并将基于该键的所有数据打印为取自 b[] 的单行,并包含对索引的引用。

    【讨论】:

    • 这会合并所有类似的“Common_Title”,但不会忽略我仍然需要的其他内容。为了做一个完整的总结,我希望每个“价值#”列在摘要文件中与其他列不同。在我的示例中,我认为在文件中不存在的地方输入“0000”可能会有用。
    • 要清楚,这是不同于 MergedFiles123.csv(上图)的输出:Common_Title,Value1,Value2,Value3 AAAA,1111,2222,3333 BBBBB,1111,2222,3333 CCCCC, 1111,3333
    • 完美!谢谢你,knsolebox!这正是我需要的,但我必须花一些时间来理解这一点: $ 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;对于 (j = 1; j MergedFiles123.csv
    • @BlacquenedRed 不客气。我添加了一些cmets。我希望它能以某种方式帮助你。任何事情,请参考 GNU Awk 的在线手册。在我看来,这是您可以参考的最简单的 awk 手册。
    猜你喜欢
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多