我有一个大文件(~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