gpt4 book ai didi

php - 如何在 Linux 上从大文件中过滤掉数据?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:17:19 25 4
gpt4 key购买 nike

我有两个文件,urls.log(1Gb)和ids.txt(20M),第一个文件urls.log看起来像这样:

/product/80x80/436284940/
/product/100x100/1051907917/Pavillon-2.jpg
/product/140x140/988563549/LITTLE-ROSE-Mikrofasermischung-Maxi-Slips-uni-5er-Pack.jpg
/product/100x100/504170379/Dunlop-SP-Sport-Maxx-215-40R17-87V-XL-VW1-MFS.jpg
...

第二个文件 ids.txt 如下所示:

988563549
988563540
988563541
...

结果应该是:(result.txt)

/product/140x140/988563549/LITTLE-ROSE-Mikrofasermischung-Maxi-Slips-uni-5er-Pack.jpg

因为988563549存在于ids.txt中所以我们需要在urls.log中有这条记录,否则,我们不需要这一行,我们也不需要 /product/80x80/5252352/ 因为它是文件夹而不是图像。

我用PHP写的是:

$file = '/combined/combine.url.sanitized.access_log';
$handle = fopen($file, "r");
if ($handle) {
while (($line = fgets($handle)) !== false)
{
$handleids = fopen('/script/ids.txt', "r");
while (($lineIds = fgets($handleids)) !== false)
{
if (strpos($line, trim($lineIds)) !== false)
{
file_put_contents('result.txt', $line . PHP_EOL, FILE_APPEND | LOCK_EX);
break;
}
}
fclose($handleids);
file_put_contents('result.txt', '=' . PHP_EOL, FILE_APPEND | LOCK_EX);
}

fclose($handle);
}

这个工作好慢,我算了一下时间,大概需要60天。那我应该怎么改进呢?可以使用其他语言来实现,但我对其他语言不熟悉,所以请告诉我更多细节。

最佳答案

当你有一个充满模式的文件,而另一个文件要搜索这些模式时,你可以使用 grep-f 选项(-F 用作您的模式文件仅包含固定字符串,不包含正则表达式模式):

grep -Ff ids.txt urls.log

要忽略任何以斜杠结尾的内容,您可以再次通过管道传输到 grep,这次使用 -v 来排除模式:

grep -Ff ids.txt urls.log | grep -v /$ > result.txt

这应该比您的 PHP 脚本更快。如果它仍然太慢,您可能需要考虑使用 Perl(例如 this question)或 Python。

关于php - 如何在 Linux 上从大文件中过滤掉数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28212823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com