awk或sed命令将大型文本文件划分为将正则匹配匹配到包含n记录的较小文件中



我想基于匹配的正则是将文本文件拆分为多个文件。使用尴尬直截了当。例如,

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

catch是,输入文本文件" file.txt"的尺寸巨大,确切地说是2.6 GB。我敢肯定,我会在目录中迅速用完最大文件限制。

上面的awk命令可以很好地完成我的工作,并将包含整个记录匹配的文件匹配到多个文件中的文件。我已经在一个较小的文件上执行了命令,每个文件都有25个这样的记录,每个记录都有各种尺寸。但是我意识到这将覆盖目录中的最大文件的限制。

我尝试了以下模式:

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

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

我想要上述awk命令中的一种方法,我可以将源文件拆分为较小的文件,每个文件包含2.5亿(或n个)。

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

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

这不应用完打开的文件手柄,因为完成后要关闭文件。

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

split -l 25000 -a 3 file.txt

将生成文件XAAA,XAAB,XAAC等,每条线不超过25000行,然后您可以使用AWK脚本进行处理