【发布时间】:2013-07-28 08:51:57
【问题描述】:
我对@987654322@ 命令背后的语义了解甚少。我想通过 shell 脚本合并并添加虚拟值。
我有两个文件要合并在一起。文件 A 有 4 列和一个 KEY 列。文件 B 有 60K+ 列,第一列是 KEY 列。
两个键的重叠率约为 80%。
目标:创建文件 C,它是文件 A 中的每个条目和文件 B 中的匹配行。如果 A 在 B 中不匹配,我希望将虚拟值“0”插入到每个缺失的字段中(60K+字段)
方法:
作为 shell 脚本的新手,我认为简单的 join 会很有效。我首先使用 sort -k# 适当地按 KEY 值对文件 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)
【问题讨论】:
-
文件有多大,其内容的性质是什么(所有数字、混合类型等),以及您是如何尝试将它们读入 R 的?
-
如果没有明确定义输出格式(参数-o),参数-e似乎不起作用。您可以尝试定义输出格式,但 60k+ 列太多了。
-
您可能需要注意
?read.table中有关内存使用的说明:“这些函数在读取大文件时会使用惊人的内存量。R Data Import/Export manual 中有广泛的讨论,补充了在这里做笔记。” -
好的。感谢您的帮助。我猜 shell 方法在这里行不通,R 也行不通。我希望避免使用 perl,但这看起来是唯一的选择。
-
不想唠叨你,但恕我直言,如果你在一行中有 60K 字段 - 这是一个糟糕的数据模型。正如您自己所看到的,管理、编辑、简单地使用它太难了……恕我直言,拥有 6000 个文件并且每个文件有 10 列(+1 键列)会更好。但是,也许只是看错了,你的里程数会有所不同...... ;)