我有两个单独的文件想要合并。每个都有 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 编程指南