【发布时间】:2016-07-31 18:15:55
【问题描述】:
我有一个文件夹,里面有大约 200 万个文件。我需要运行以下命令:
sed -i 's/<title>/<item><title>/g;s/rel="nofollow"//g;s/<\/a> •/]]><\/wp:meta_value><\/wp:postmeta><content:encoded><![CDATA[/g;s/By <a href="http:\/\/www.website.com\/authors.*itemprop="author">/<wp:postmeta><wp:meta_key><![CDATA[custom_author]]><\/wp:meta_key><wp:meta_value><![CDATA[/g' /home/testing/*
sed -i '$a]]></content:encoded><wp:status><![CDATA[draft]]></wp:status><wp:post_type><![CDATA[post]]></wp:post_type><dc:creator><![CDATA[Database]]></dc:creator></item>\' /home/testing/*
awk -i inplace 1 ORS=' ' /home/testing/*
我遇到的问题是,当我运行第一个命令时,它会循环遍历所有 200 万个文件,然后我继续执行第二个命令,依此类推。问题是我基本上总共要打开文件 600 万次。
我希望在打开每个文件时,在其上运行所有 3 个命令,然后继续执行下一个。希望这是有道理的。
【问题讨论】:
-
你考虑过Perl吗? 正是这是Perl存在的原因(IMO)。
-
一个文件需要多长时间?也许您应该首先将文件夹划分为子文件夹/批次。更多cpu的一对一系统并想要并行处理?也许在不同的磁盘上。
-
我想你先做一个备份。
sed -i也会创建一个临时文件。我会将输出重定向到新文件。 -
@ElliottFrisch no 正是 this 是 AWK 存在的原因。 Perl 的存在是为了您需要做的不仅仅是操作文本。爱德华 - 编辑您的问题以包含简洁、可测试的示例输入和预期输出,不要指望我们通过阅读一堆其他脚本来尝试对您需要脚本执行的操作进行逆向工程。
-
@ElliottFrisch 同意。我用 csh,sed,awk 写了 10 年 [以任意组合]。然后,我发现了 perl。我很快意识到它可以替换 all ,我重写了所有内容以仅使用 perl。 perl 的一个优点是能够在实际运行之前使用
perl -c预先检查脚本,有点像编译器。现在,20 年后,我有 250,000 行 perl 并且从未回头。 perl [和 python] 是经过编译的成熟的编程语言,它们也可以做 shell 所做的事情或像 sed/awk 这样的模式操作程序所做的事情——还有很多很多
标签: bash shell awk command-line sed