Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 合并多个文件:第1列(相同字符串),第2列(每个文件的唯一值)_Python_Bash_Awk_Merge - Fatal编程技术网

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

Python 合并多个文件:第1列(相同字符串),第2列(每个文件的唯一值),python,bash,awk,merge,Python,Bash,Awk,Merge,我有多个文件(*.csv),它们有一个公共列(“公共标题”)和相应的值(“值”),我需要将它们合并到一个摘要文件中 一个困难的部分是,我需要将所有值传递到摘要文件中,但个别文件有时缺少某个“公共标题”,因此需要在其“值”位置放置一个“0000” 这是3个示例文件,都有点不同 # File1.csv Common_Title,Value1 AAAAA,1111 BBBBB,1111 CCCCC,1111 # File2.csv Common_Title,Value2 AAAAA,2222 B

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

一个困难的部分是,我需要将所有值传递到摘要文件中,但个别文件有时缺少某个“公共标题”,因此需要在其“值”位置放置一个“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
使用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
评论:

  • !条件为
    的[$1]+{keys[++i]=$1}
    ![$1]+
    块(
    {}
    )只能在第一次遇到
    $1
    时计算。在块内部,键(
    $1
    )被添加到
    数组中一次
  • !r[FILENAME]++{++argid}
    每次遇到新文件时,都会递增计数器
    argid
  • {b[$1,argid]=$2}
    参考
    键和当前文件的索引
    argid
    存储数据

  • END{for(i=1;i in keys;++i){k=keys[i];t=k;for(j=1;j)这将合并所有类似的“Common_Title”,但不会传递我仍然需要的其他标题。为了做一个完整的摘要,我希望每个“Value#”列在摘要文件中表示为与其他列不同的唯一列。在我的示例中,我想输入“0000”如果文件中没有,则可能有用。要明确,这是不同于MergedFiles123.csv(如上)的输出:Common_Title,Value1,Value2,Value3 AAAAA,111122223333 BBBBB,111122223333 CCCCC,11113333完美!谢谢你,knoslebox!!这正是我需要的,但我必须花一些时间来理解:$awk-F',!a[$1]+{keys[++I]=$1}!r[FILENAME]+{++++argid}{b[$1,argid]=$2}END{(i=1;i-in-keys;++i{k=keys[i];t=k;for(j=1;j@blacquenered)不客气。我添加了一些评论。我希望它能对您有所帮助。有关任何内容,请参考GNU Awk的在线手册。在我看来,这是Awk中最简单的手册,您可以参考。
    
    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