我需要根据模式在子文件中拆分一个巨大的文件(大约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。)
答案 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