awk或sed命令将匹配正则表达式的大文本文件拆分为每个包含n条记录的较小文件

时间:2014-02-05 13:26:43

标签: sed awk

我想根据匹配的正则表达式将文本文件拆分为多个文件。这很简单,使用awk。 例如,

tmp_file_prefix="f-" ; awk '/^ID:/{x="'"$tmp_file_prefix"'" ++i;} {print > x;}' file.txt

问题是,输入文本文件“file.txt”的大小很大,精确到2.6 GB。 我敢肯定,我会快速耗尽目录中的最大文件限制。

上面的awk命令可以很好地完成我的工作,并将包含与正则表达式匹配的整个记录​​的文件拆分为多个文件。我已经在一个较小的文件上执行了命令,其中包含25个这样的记录,每个记录都有不同的大但我意识到这将超出目录中max files的限制。

我尝试了以下模式:

tmp_file_prefix="f-" ; awk -v i=0 '/^ID:/{x="'"$tmp_file_prefix"'" ++i;} i % 20 == 0 {print > x;}' file.txt

并意识到它只发出第20个模式并将其保存在文件中。这个解决方案不正确。

我想在上面说的awk命令中找到一种方法,我可以将源文件拆分成较小的文件,每个文件包含25000千(或者n为n)的正则表达式。

3 个答案:

答案 0 :(得分:2)

grep '^ID:' file.txt | split -l 25000

答案 1 :(得分:1)

awk -v prefix="$tmp_file_prefix" -v max=25000 '
    function filename() { return sprintf(%s%06d", prefix, ++i) }
    !x { x = filename() }
    /^ID:/ {
        print > x
        n++
        if (n == max) {
            close x
            x = ""
            n = 0
        }
    }
' file

这不应该用完打开的文件句柄,因为它在完成后会关闭文件。

答案 2 :(得分:0)

您可以先使用 split(1)将源文件拆分为较小的部分,然后在每个部分上运行awk脚本。显然你需要附加到输出文件,而不是覆盖它们!

split -l 25000 -a 3 file.txt

将生成文件xaaa,xaab,xaac等,每行不超过25000行,然后您可以使用awk脚本处理