我想根据匹配的正则表达式将文本文件拆分为多个文件。这很简单,使用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)的正则表达式。
答案 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脚本处理