Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix awk中的错误:“0”;无法打开-打开的文件太多“;_Unix_Awk - Fatal编程技术网

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

Unix awk中的错误:“0”;无法打开-打开的文件太多“;,unix,awk,Unix,Awk,我需要根据一个模式将一个巨大的文件(大约400万行)拆分成子文件 我总是使用awk来完成这项工作,并且在文件中工作得非常完美,直到大约十万行。大于该值的文件将返回以下错误: awk:无法为输出打开“文件名”(打开的文件太多) 下面是我正在使用的命令行: awk '{OFS="\t"; print $1,$2,$3,$4,$12 > $10"_"$8.txt"}' mybigfile.txt 在$10中,我需要分成大约四五千种不同的模式 我怎样才能克服这个错误?我应该在哪里插入close

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

我总是使用awk来完成这项工作,并且在文件中工作得非常完美,直到大约十万行。大于该值的文件将返回以下错误:

awk:无法为输出打开“文件名”(打开的文件太多)
下面是我正在使用的命令行:

awk '{OFS="\t"; print $1,$2,$3,$4,$12 > $10"_"$8.txt"}' mybigfile.txt
$10
中,我需要分成大约四五千种不同的模式

我怎样才能克服这个错误?我应该在哪里插入
close
命令?
(我使用的是Ubuntu发行版中的awk。)

因此,每当您以$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

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

awk 'BEGIN{OFS="\t"} {out=$10"_"$8".txt"; print $1,$2,$3,$4,$12 >> out; close(out)}' mybigfile.txt
您遇到了两个问题:

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

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

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

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

与其他几种AWK不同,从技术上讲,您不需要使用gawk将输出重定向右侧的表达式插入括号中,但这是一个好习惯,便于移植并有助于可读性。

感谢您回答Ravinder!不幸的是,它不起作用。首先返回这些错误:awk:1:意外字符“.”awk:1行:失控字符串常量“}…然后我去掉“.txt”扩展名并开始运行,只返回一个文件,字面上命名为“$10$8”(奇怪)。看起来所有新拆分的文件都放在同一个$10$8的文件中,覆盖了以前的全部数据。不确定,但它对我有效,您使用的是哪种操作系统?如果您在Solaris/SunOS系统上使用,请将awk更改为/usr/xpg4/bin/awk、/usr/xpg6/bin/awk或nawk。我正在使用ubuntu作为虚拟机…尝试解决这个问题,我不知道我在awk方面没有太多经验。无论如何谢谢你!!数一数你命令中的双引号,注意它是一个奇数。现在想想这意味着什么。Ed,非常感谢你的指导。我使用了你建议的第一个命令,效果非常好(实际上,我会手动检查一些文件以确定,但我认为它是完美的)。感谢所有花时间帮助我完成此任务的人,非常感谢。正如好奇:此运行需要1个多小时才能完成…不客气。仅供参考,如果您的输入被正确排序,则不会花费如此长的时间,但由于您未提供任何示例输入/输出,我们所能做的只是帮助您修复脚本,而不是改进我相信你的方法。