【问题标题】:Combining multiple tables/files by mapping to a common column - awk,sed通过映射到一个公共列来组合多个表/文件 - awk,sed
【发布时间】:2021-07-17 07:12:57
【问题描述】:

这是经过编辑的帖子 (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     

谁能帮我解决这个问题?

谢谢。

【问题讨论】:

标签: unix awk sed


【解决方案1】:

查看您的上一篇文章,我相信@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

这对您的“真实”数据有效吗?

【讨论】:

  • 它没有用。也许我在命令中犯了一些错误。它只是显示了第一个文件的输出。这是我目录中的文件列表 file-0 file-0.txt file-1 file-10 file-2 file-3 file-4 file-5 file-6 file-7文件 8 文件 9
  • command-cut -d" " -f1 file-0 > file-0.txt\cat file-0.txt\cat file-1\cat file-2\cat file-3\cat file-4 \ cat file-5 \ cat file-6 \ cat file-7 \ cat file-8 \ cat file-9 \ cat file-10 \ 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
  • 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&lt;=ARGIND; fileNr++) { printf "%s%s", OFS, map[key][fileNr] } print "" } } ' file-* 有输出吗?
  • 对不起。我的一个文件用 0 代替 K0XX。我重新生成了所有文件并运行了命令。该命令有点工作,但它显示了相同 KOXX 的多个实例。输出文件还显示 11 列(不包括第一个 KOXX 列)而不是 10。这是输出-
  • 好的,我建议你删除这个问题并使用实际文件的前 10 行创建一个新问题,即 head file-0 &gt; example-0head file-1 &gt; example-1 等,然后在其中包含 example-0 和 example-1你的问题。我认为这将为您提供获得解决方案的最佳机会
猜你喜欢
  • 2020-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多