regex - 在 awk 中使用非精确匹配合并两个文件

标签 regex bash awk merge grep

我正在尝试使用 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/

相关文章:

javascript - 查找并替换正则表达式 JavaScript

bash - 我的 awk 用户函数无法在 bash 脚本中运行

ruby - OS 10.9 上的 rvm 出现一些问题 : second export path to . bash_profile、缺少 2.0 路径和缺少文件

bash - 如何使用 awk 检测只有一个字段的行并将其与下一行一起打印?

awk - 用键分隔行并存储在不同的文件中

Sed:模式后的复杂替换(在同一行)

java - 正则表达式选择 XML 标签之间的空格

regex - Visual DataFlex 正则表达式

r - 如何使用 '|' 字符进行 strsplit,它的行为异常?

bash - 使用 GNU find 命令忽略/删除隐藏目录