Shell 脚本 bash 有 2 个大约 1.2 GB 数据的大文件,带有键和值,我需要根据键比较两个文件并将值的差异存储在第三个文件中,文件 2 将始终是文件 1 的子集,只需要找到文件 2 中不存在的值(针对键)以及文件 1 中唯一的值。
文件一:
test1 marco;polo;angus
test2 mike;zen;liza
test3 tom;harry;alan
test4 bob;june;janet
1332239_44557576_CONTI Lased & Micro kjd $353.50_30062020_lsdf3_no-rule 343323H;343434311H;454656556H;343343432H
1332240_44557576_CONTI Mazed & Micro kjd $353.50_30062020_lsdf3_some-rule 232324L;2226556H;343223432H
文件2:
test1 polo;angus
test2 mike
test4 bob;janet
1332240_44557576_CONTI Mazed & Micro kjd $353.50_30062020_lsdf3_some-rule 232324L;343223432H
我想比较 file1 和 file2 的前两列(搜索前两列中 file2 的全部内容),如果它们匹配,则打印值的差异。然后搜索文件1的第二行,依此类推。文件 1 中唯一的密钥也应该被打印。
预期输出:
test1 marco
test2 zen;liza
test3 tom;harry;alan
test4 june
1332239_44557576_CONTI Lased & Micro kjd $353.50_30062020_lsdf3_no-rule 343323H;343434311H;454656556H;343343432H
1332240_44557576_CONTI Mazed & Micro kjd $353.50_30062020_lsdf3_some-rule 2226556H
我的文件很大,包含大约 100,000 行,所以我想让执行速度更快。这是使用 bash shell 脚本在 shell 脚本中运行的。这些文件file1
是file2
文本文件,其作为键 ( 1332239_44557576_CONTI Lased & Micro kjd $353.50_30062020_lsdf3_no-rule
),这些作为值: ( 343323H;343434311H;454656556H;343343432H
)
答案1
如果您致力于 shell 脚本编写:首先将文件规范化为每行一个键和一个值。然后,如果它们已排序,该命令comm
可以提取其中一个而不是另一个中的行。然后只需再次对文件进行非规范化即可(如果需要的话)。
更好的选择可能是用更高级的语言构建一个小程序(我自己可能会使用 perl5)来逐行读取两个输入文件,并输出差异。同样,您希望对输入进行排序,除非您计划使用大量内存。
想必您已经有设计用于处理这种格式的程序。使用该软件的输入功能是一个很好的起点。