join
我对命令背后的语义了解甚少。我想通过 shell 脚本合并并添加虚拟值。
我有两个文件要合并在一起。文件 A 有 4 列和一个 KEY 列。文件 B 有 60K+ 列,第一列是 KEY 列。
两个键在约 80% 处重叠。
目标:创建文件 C,它是文件 A 中的每个条目和文件 B 中的匹配行。如果 A 在 B 中不匹配,我希望将虚拟值“0”插入到每个缺失的字段(60K+ 字段)中
方法:
作为 shell 脚本的新手,我认为一个简单的join
方法会很有效。sort -k#
我首先使用适当的键值对文件 A 和 B 进行排序。
join -a1 -1 2 -2 1 -e "0" file.A file.B > file.C
现在, join如何查看其查看的字段/列?文件 B 有 60k-1 列,间隔为:
KEY 1 0 1 1 2 4 0 1 ...
现在,当我尝试我的命令时,文件 C 具有正确的条目数,但我不知道如何添加缺失值。文件 A 具有文件 B 没有的条目,我想将空值 0 放置在文件 B 在文件 A 中不匹配的每一列中。
因此,在文件 C 中,结果应该是(根据我对join的理解):
KEY A1 A2 A3 A4 1 0 1 1 2 4 0 1 ...
KEY A1 A2 A3 A4 0 0 0 0 0 0 0 0 ...
连接后的间距对我来说并不重要,但文件 B 是使用交替制表符空格制表符格式创建的。
当我要求时,为什么不join -e "0"
添加我的虚拟值?我也很感激任何其他的 shell 策略来做到这一点。我知道我可以通过逐行运行它来合并perl(或者如果加载时间不长,则使用R),但我觉得shell为此配备了更强大的功能。
编辑
文件中的数据是混合的。前 5 列是文件 A 中的标识字符串,在文件 B 中,每个附加项中都有一个关键字符串和单个字母数字字符。文件 A 总是很小(不超过 1 MB),但文件 B 可以扩展到 2+ GB。
尝试R:
df <- read.table("file.B", header=FALSE, fill=TRUE)