我正在尝试使用 awk 合并 2 个文件。第一个文件如下所示
exm-IND1-200449980 1 202183358
exm-IND1-201453487 1 203186865
exm-IND10-102817747 10 102827758
文件 2 如下所示
exm-IND1-200449980_ver3 -0.0676 0.9988
exm-IND1-201453487_ver1 0.0845 0.0163
exm-IND10-102817747_ver3 -0.1154 0.5166
我想将文件 2 的第一列添加到文件 1 的信息中。我希望它在两个文件的第一列上匹配,但忽略“_ver3”或“_ver1”字段。我无法根据需要删除这些信息。
我以为 grep 会找到不精确的匹配项,但是当我尝试时
grep exm-INDI1-200449980_ver3 file1
没有返回任何内容
我已经尝试过
awk 'NR==FNR{a[$1]=$0; next;}$1 in a {print a[$1]" "$1" "$2" "$3}' file2 file1 > file3
但它没有给我任何输出,我想是因为它只搜索完全匹配?
文件 2 约有 16,000 行,文件 1 约有 1,000,000 行。
我正在寻找的输出是这样的,
exm-IND1-200449980 1 202183358 exm-IND1-20449980_ver3
exm-IND1-201453487 1 203186865 exm-IND1-201453487_ver1
最佳答案
这应该可以解决问题:
$ awk -F'_| *' 'FNR==NR{a[$1]=$0;next}$1 in a{print a[$1],$1"_"$2}' file1 file2
exm-IND1-200449980 1 202183358 exm-IND1-200449980_ver3
exm-IND1-201453487 1 203186865 exm-IND1-201453487_ver1
exm-IND10-102817747 10 102827758 exm-IND10-102817747_ver3
确保您有足够的内存来保存 file1
,尽管根据我的估计,该文件应该小于 50 MB,这对于过去十年制造的大多数机器来说不会是问题。如果大小确实成为问题,您应该考虑将文件拆分为多个 block (您可以使用 split 命令来实现此目的)。
关于regex - 在 awk 中使用非精确匹配合并两个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18714395/