当字段在一个巨大的文件中是数字时加入unix

Join in unix when field is numeric in a huge file

所以我有两个文件。 File AFile BFile A 很大 (>60 GB),有 16 行,混合了数字和字符串,由“|”分隔,并且有超过 600,000,000 行。这个文件中的字段3是ID,是一个数字字段,有不同的长度(例如,某人的ID可以是1,其他人的可以是100)

File B 只有一堆 ID (~1,000,000),我想从 File A 中提取 ID 在“文件 B”中的所有行。我已经开始使用 Linux 和以下代码

sort -k3,3 -t'|' FileA.txt  > FileASorted.txt
sort -k1,1 -t'|' FileB.txt  > FileBSorted.txt

join -1 3 -2 1 -t'|' FileASorted.txt FileBSorted.txt > merged.txt

我遇到的问题是 merged.txt 是空的(当我知道至少有 10 个匹配项时)...我用谷歌搜索了一下,问题似乎在于连接字段(ID)是数字。有些人建议用零填充该字段,但 1) 我不完全确定该怎么做,以及 2) 这似乎 slow/time 效率很低。

还有其他想法吗?或帮助如何仅向相关字段添加 0 的填充。

我会首先使用唯一标志 (-u) 对文件 b 进行排序

sort -u file.b > sortedfile.b

然后遍历 sortedfile.b 并针对每个 grep file.a。在 zsh 中我会做 a

foreach C (`cat sortedfile.b`)
    grep $C file.a > /dev/null
    if [ $? -eq 0 ]; then
        echo $C >> res.txt
    fi
end

将 grep 的输出重定向到 /dev/null 并测试是否存在匹配项 ($? -eq 0) 并将该行的结果附加 (>>) 到 res.txt.

单个 > 将覆盖文件。我现在对 zsh 有点生疏,所以可能有错字。您可能正在使用 bash,它的 foreach 语法可能略有不同。