删除每n行以使用sed或awk删除数据块

时间:2015-07-22 20:26:02

标签: bash awk sed grep

我有一个由316125000行组成的大文件。该文件由112500个数据块组成,每个数据块有2810行。

我需要减小文件的大小,所以我想留下第1个,第10个,第20个,第112490个和第112450个数据块,并删除所有其他数据块。结果这将给我11250个数据块。

这意味着我想要删除每个2811~28100行,并留下每1~2810和28101~30910 ....行。

我在考虑awk,sed或grep,但哪一个更快,我怎么能实现这个?我知道如何使用awk和NR删除每一行或第三行,但我不知道如何重复删除大块行。

谢谢

最好,

2 个答案:

答案 0 :(得分:5)

这些方面的某些内容可能有效:

echo '<form action="'.htmlspecialchars($_SERVER["PHP_SELF"]).'"  method="post">';
echo '<input type="hidden" value="' . $input_process . '" name="delay"/>';
echo '<input type="submit" value="Activate" name="activate_button"/>';
echo '</form>';

也就是说,awk 'int((NR - 1) / 2810) % 10 == 0' <infile >outfile 给出当前行(int((NR - 1) / 2810))的2810行的块的(从零开始)数,并且如果该块号的剩余部分除以10为0 (NR)打印该行。这应该导致每10个块被打印,包括第一个块(块号0)。

答案 1 :(得分:3)

我不认为哪个是最快的,但我可以为您的基准测试提供GNU sed配方:

sed -e '2811~28100,+25289d' <input >output

这说:从第2811行开始,之后每28100行,删除它和下一个25289行。

同样,我们可以使用sed -n并每28100行打印1-2810行:

sed -ne '1~28100,+2809p' <input >output