awk 中的错误:"cannot open - too many open files"



我需要根据模式将一个巨大的文件(大约 400 万行(拆分为子文件。

我总是使用 awk 来做到这一点,并在文件中完美运行,直到大约十万行。大于此值的文件将返回以下错误:

awk: cannot open "filename" for output (Too many open files)

这是我使用的命令行:

awk '{OFS="t"; print $1,$2,$3,$4,$12 > $10"_"$8.txt"}' mybigfile.txt

$10中,我需要分成大约 4 或 5000 种不同的模式。

如何克服此错误?我应该在哪里插入close命令? (我在 Ubuntu 发行版中使用了 awk。

完全复制/粘贴此命令,它将起作用:

awk 'BEGIN{OFS="t"} {out=$10"_"$8".txt"; print $1,$2,$3,$4,$12 >> out; close(out)}' mybigfile.txt

您遇到了 2 个问题:

1(您正在使用的awk不是GNU awk,因此在需要时不会为您关闭文件,并且

2(你正在重新输入人们建议你使用的命令,而不是复制粘贴它们并在你这样做时弄乱引号,就像在你的问题中的脚本中一样。

如果你可以使用gawk,那么它就是:

awk 'BEGIN{OFS="t"} {print $1,$2,$3,$4,$12 > ($10"_"$8".txt")}' mybigfile.txt

与其他几个 awk 不同,从技术上讲,您不需要用 gawk 将输出重定向右侧的表达式括起来,但为了可移植性并有助于可读性,这是一个好习惯。

因此,每当您按 $10、$8 的值创建一个新文件时,它都会将行写入其中,但在后端,由于 awk 程序仍在运行,它不会关闭这些文件,这将导致此 awk 程序打开文件的限制,因此我们必须关闭这些文件。

请尝试关注,并让我知道这是否对您有帮助。

awk 'BEGIN{OFS="t";} {if(prev){close(prev)};print $1,$2,$3,$4,$12 >> ($10"_"$8".txt");prev=$10"_"$8".txt"}' mybigfile.txt

最新更新