如何合并两个文件的列、删除重复项以及填充缺失的行

如何合并两个文件的列、删除重复项以及填充缺失的行

我有两个单独的文件想要合并。每个都有 7 列:

1 10 6 0.02 A 45 0.17
1 15 6 0.03 A 67 0.17
2 33 6 0.10 A 23 0.17 

1 10 6 0.04 B 87 0.17
1 12 6 0.12 B 93 0.17
2 33 6 0.08 B 45 0.17

我想合并每个文件的第 1 列和第 2 列,同时删除重复项,然后将每个文件中的第 4 5 6 列添加到第 1 列和第 2 列的相应组合中。然后,如果第 1 列和第 2 列不匹配,我希望它们然而,对于缺少的文件,要打印它,将 0 而不是第 4、5 和 6 列,这样最终文件将是

1 10 0.02 A 45 0.04 B 87
1 12 0    0 0  0.12 B 93
1 15 0.03 A 67 0    0 0
2 33 0.10 A 23 0.08 B 45

答案1

一个简单的方法是在 awk 中使用二维数组

FNR==NR {a[$1FS$2][0]=$4FS$5FS$6; next}
        {a[$1FS$2][1]=$4FS$5FS$6}
END {
    empty="0"FS"0"FS"0"
    for(i in a)
        print i FS (a[i][0]? a[i][0] : empty) FS (a[i][1]? a[i][1] : empty)
}

您可以将脚本保存为文件并执行

awk -f main.awk file1 file2

说明

  • 第一行FNR==NR扫描 file1 并将所需的列$4 $5 $6与关联的键存储$1 $2在数组中a[$1FS$2][0]
  • 第二行基本上在 file2 上执行相同的操作,但将值存储到数组中a[$1FS$2][1],请注意,这些数组分配操作将自动删除重复项,因为 awk 中的数组是联想性的,意味着每个键只能出现一次
  • 在里面的最后一步END,打印出每一行并将每个空值替换为预定义的字符串0 0 0
  • 如果您希望输出按索引值升序排序,请将 a 添加PROCINFO["sorted_in"] = "@ind_str_asc"到内部的第一行END

如果您有时间,仔细阅读文档会很有帮助Gawk 编程指南

相关内容