当字段在一个巨大的文件中是数字时加入unix
Join in unix when field is numeric in a huge file
所以我有两个文件。 File A
和 File B
。 File 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 语法可能略有不同。
所以我有两个文件。 File A
和 File B
。 File 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 语法可能略有不同。