我正在尝试清理一个巨大的电子邮件数据库,但是当我使用以下 Grep 命令时,出现“内存耗尽”错误。
pv "Suppresion-List.txt" | grep -vf <(sed 's/^/^/; s/$/$/' EMAILS.txt) > RESULT.txt
这两个文件中的数据集非常庞大,就像超过 500 万封电子邮件一样,因此 Linux 服务器给了我“内存耗尽”错误。
因此我决定将文件分成几个小文件,每个文件包含 10,000 封电子邮件进行处理。
split -d -l 10000 EMAILS.txt Segment
如何创建带有循环的 Bash 脚本,其中它按递增顺序检查创建的分割文件,并从创建的第一个文件开始处理 - 例如:Segment00
pv "Suppresion-List.txt" | grep -vf <(sed 's/^/^/; s/$/$/' Segment00) > RESULT.txt
...然后自动循环相同的命令并替换命令中的第二个段文件 - 例如:Segment01
pv "Suppresion-List.txt" | grep -vf <(sed 's/^/^/; s/$/$/' Segment01) > RESULT.txt
...循环一直进行到最后一段然后最终终止。
你能帮我写这样的 Bash 脚本吗?我不知道如何在循环中自动按升序替换分段文件以编写 shell 脚本。
请帮忙。
答案1
例如,您可以使用for
这样的循环:
for i in Segment??
do
pv "Suppresion-List.txt" | grep -vf <(sed 's/^/^/; s/$/$/' "$i") >> RESULT.txt
done
这将对所有文件执行命令Segment<symbol><symbol>
并将结果添加到RESULT.txt
根据评论,命令应该是:
pv "RESULT-1.txt" | grep -vf <(sed 's/^/^/; s/$/$/' "$i") >> RESULT.txt