我有 2 个 csv 文件。第一个文件很大(> 400 个字段和许多行> 1 mil),需要通过匹配的连接附加另一个字段。
我想加入一个领域 $170
我努力了
gawk 'BEGIN {OFS=FS=","} NR==FNR{b[$1]=$2; next}
$170 in b {print $0,b[$170]}
' b a
根据 Why is not this awk command doing a full outer join? (参见@cuonglm 的回答)
我没有对此进行测试,但想知道随着文件大小增加的“最佳”方法。
@cuonglm 建议使用join
,但这会重新排列列以将连接字段放在首位。
我不能join
使用参数轻松地为命令编写长输出格式,-o
因为这会很长:
join -1 170 -2 1 -o1.1 1.2 1.3 1.4......1.300.... file1 file2
有没有办法join
更容易做到这一点?
或者我应该坚持使用gawk
, 作为文件大小问题(例如,文件 a 和 b 中的最大行数为 5 百万行,都具有大约 500 列)?
我进行了全面的傻瓜测试。我制作了一个 500 万行 x 500 列 (20 GB) 的 CSV,以及一个 500 万行 x 2 列的边文件。关键字段是唯一的(我有 500 万个素数),位于大文件的第 170 列和边文件的第 1 列。这两个文件都包含独立随机顺序的密钥。所有其他字段都包含来自大约 14000 个单词的随机选择(从手册页中摘录)。
awk 脚本运行了将近 20 分钟,整个过程使用了大约 0.8 GB 的内存。这是在 4 GB 笔记本电脑和 5400 rpm 硬盘上。此日志显示时间和文件大小以及列数。
我制作了一个迷你版的文件来展示它的作用,六行六列,键在第 4 列。
这是合并脚本。如果可以提供信息,我可以发布数据创建脚本。