通过映射到公共列来组合多个表/文件 - awk,sed

时间:2021-04-23 04:00:38

标签: unix awk sed

这是经过编辑的帖子 (awk,sed method to combine multiple files to one by mapping to a common file/column)

由于我的天真,最后一个帖子的格式不正确,在得到正确答案之前就被关闭了。由于某种未知原因,我无法编辑/删除所述帖子。

很抱歉给您带来麻烦。希望这是正确的格式。

我有 11 个(制表符分隔的)文件,每个文件有两列,如下所示。行数因某些文件有 1000 行而有些文件超过 2500 行而异。

文件 0

这是映射文件

K00001 0
K00002 0
K00003 0
K00004 0
K00005 0

此文件上升到 K30000 0 覆盖文件其余部分中的所有 K 数字

文件 1

K00002 0.60
K00003 31
K00006 0.21
K00007 0.06
K00012 0.01

文件 2

K00003 21
K00004 0.54
K00005 0.4
K00006 0.01
K00009 0.39
K00010 0.01

文件 3

K00002 09
K00003 0.11
K00004 0.87
K00006 0.54
K00007 0.11
K00008 0.02

我想通过映射到 file-0 的第一列将所有这 10 个文件 (file-1....file-10) 合并为一个。我想要的输出是这样的:

K00001
K00002 0.60         9
K00003 31 21        0.11
K00004       0.54   0.87
K00005       0.4    
K00006 0.21  0.01   0.54
K00007 0.06         0.11
K00008              0.02
K00009       0.39   
K000010      0.01   
K000011         
K00012 0.01     

谁能帮我解决这个问题?

谢谢。

1 个答案:

答案 0 :(得分:0)

看看你的最后一篇文章,我相信@EdMorten 的 AWK 答案就是你正在寻找的解决方案——你只需要将字段分隔符从 "\t" 更改为 " ":

# To get the first column of the mapping file (i.e. lose the column of zeros):
cut -d" " -f1 file0 > test1.txt

cat test1.txt
K00001
K00002
K00003
K00004
K00005
K00006
K00007
K00008
K00009
K00010
K00011
K00012
K00013
cat test2.txt
K00002 0.60
K00003 31
K00006 0.21
K00007 0.06
K00012 0.01
cat test3.txt
K00003 21
K00004 0.54
K00005 0.4
K00006 0.01
K00009 0.39
K00010 0.01
cat test4.txt
K00002 09
K00003 0.11
K00004 0.87
K00006 0.54
K00007 0.11
K00008 0.02
awk '
    BEGIN { FS=OFS=" " }
    { map[$1][ARGIND] = $2 }
    END {
        PROCINFO["sorted_in"] = "@ind_str_asc"
        for (key in map) {
            printf "%s", key
            for (fileNr=1; fileNr<=ARGIND; fileNr++) {
                printf "%s%s", OFS, map[key][fileNr]
            }
            print ""
        }
    }
' test*.txt
K00001
K00002 0.60  09
K00003 31 21 0.11
K00004  0.54 0.87
K00005  0.4
K00006 0.21 0.01 0.54
K00007 0.06  0.11
K00008   0.02
K00009  0.39
K00010  0.01
K00011
K00012 0.01
K00013

这是否适用于您的“真实”数据?