从索引文件中查找不完全匹配的匹配项并打印最后一个字段

从索引文件中查找不完全匹配的匹配项并打印最后一个字段

我有一个大文件(~6mill 行),有 2 列,如下所示:

1111.aaaaabbb.b.cccc.c  ValueA
2222.dddddeee.e.ffff.f  ValueB
3333.gggghhhh.h.iiii.i  ValueC

我想在搜索这个单列文件时使用它作为索引:

aaaaabbb.b  
dddddeee.e  
gggghhhh.h  

并返回:

ValueA
ValueB
ValueC
[...]
Valuen

正如您所看到的,我只关心第一个句点之后的值,只要第二个文件的内容与第一个文件的内容完全匹配(不精确),我希望它返回第一个文件中第 2 列的值文件。我不关心第一个文件内容的前缀/后缀,只要文件 2 的确切内容匹配即可。

有什么方法awk或任何bash工具可以做到这一点吗?目前,我正在尝试在 Excel(数据到列工具)中正确格式化数据,但这需要很长很长的时间,因为我有超过 600 万行,所以我必须手动执行 6 个文件,然后将结果编译在一起。

编辑关于file1内容:前缀始终是数字,但长度从 4 到 7 位不等。第一个句点之后的内容是字母数字,长度从 4 到 15 个字符不等,可以以数字或字母开头,后缀也可以是数字/字母。

答案1

我假设带有索引的文件不是太大,它可以完全加载到内存中。如果是,您可以使用这个awk

awk -F"[. ]" 'FNR==NR{a[$0]=1} FNR!=NR&&a[$2"."$3]{print $NF}' index_file huge_file

  • awk使用两个文件调用:index_file包含要搜索的内容和huge_file问题中的许多行。
  • -F"[. ]"将 awks 分隔符设置为空格和点。
  • FNR==NR仅适用于index_file
    • a[$0]=1使用搜索模式作为索引填充数组a并将值设置为1,即构建了数组。
  • FNR!=NR仅适用于huge_file.
  • a[$2"."$3]如果通过点连接的字段 2 和字段 3 的数组索引存在(当找到模式时)...
    • print $NF打印文件的最后一个字段。

输出:

ValueA
ValueB
ValueC

相关内容