我想基于匹配的正则是将文本文件拆分为多个文件。使用尴尬直截了当。例如,
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脚本进行处理