0

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)

4

1 回答 1

1

我在join信息页面中读到:

`-e STRING'
     Replace those output fields that are missing in the input with
     STRING.  I.E. missing fields specified with the `-12jo' options.

我推断这-o是必需的。尝试这个:

join -a1 -1 2 -2 1 -o auto -e "0" file.A file.B > file.C
于 2013-07-30T16:28:09.843 回答