awk中的错误:“无法打开 - 打开的文件太多”

时间:2017-08-21 16:03:40

标签: unix awk

我需要根据模式在子文件中拆分一个巨大的文件(大约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或5千种不同的模式。

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

2 个答案:

答案 0 :(得分:2)

复制/粘贴此命令,工作:

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

您遇到了两个问题:

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

2)您正在重新输入人们建议您使用的命令,而不是复制粘贴它们并在您执行此操作时弄乱引号,就像您问题中的脚本一样。

如果您可以使用gawk,那么它只是:

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

与其他几个问题不同,你不需要在技术上需要在输出重定向的右侧用gawk括起表达式,但这是一个很好的习惯,可以实现便携性和有助于提高可读性。

答案 1 :(得分:1)

因此,无论何时以$ 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