【发布时间】:2018-10-17 09:35:38
【问题描述】:
我有一个包含 60210 行的大 csv 文件。这些行包含哈希、路径和文件名,如下所示:
hash | path | number | hash-2 | name
459asde2c6a221f6... | folder/..| 6 | 1a484efd6.. | file.txt
777abeef659a481f... | folder/..| 1 | 00ab89e6f.. | anotherfile.txt
....
我正在根据哈希列表过滤此文件,为了方便过滤过程,我创建并使用此文件的简化版本,如下所示:
hash | path
459asde2c6a221f6... | folder/..
777abeef659a481f... | folder/..
过滤后的结果包含所有具有我的参考哈希库中不存在的哈希的行。
但要对过滤结果进行正确分析,我需要之前删除的数据。所以我的想法是读取过滤后的结果文件,搜索hash 字段,并将其写入包含所有数据的增强结果文件中。
我使用循环来这样做:
getRealNames() {
originalcontent="$( cat $originalfile)"
while IFS='' read -r line; do
hash=$( echo "$line" | cut -f 1 -d " " )
originalline=$( echo "$originalcontent" |grep "$hash" )
if [ ! -z "$originalline" ]; then
echo "$originalline" > "$resultenhanced"
fi
done < "$resultfile"
}
但在实际使用中,它的效率非常低:对于之前的文件,这个循环在 4Go RAM、Intel Centrino 2 系统上运行大约需要 3 个小时,而且在我看来这种操作的时间太长了。
有什么办法可以改进这个操作吗?
【问题讨论】:
-
目前还不清楚您给定输入的确切输出是什么。使用确切的详细信息更新问题
-
@Inian 刚刚做到了。我基本上是在过滤有关参考哈希库的行,并且我想获取不在此参考库中的所有哈希的列表。
-
您能否提供更多输入行进行测试。现在 ref 中的所有行都在原始文件中
-
60K 行不算大;为什么要减少它?
-
这是我正在使用的过滤功能的要求。我必须以这种方式格式化输入才能正确过滤。