Bash 如何在生成文件列表时关闭awk中的文件?

Bash 如何在生成文件列表时关闭awk中的文件?,bash,text,awk,Bash,Text,Awk,伙计们,我正试图找到一种方法来避免awk错误“打开的文件太多”。我的情况如下: 输入:ASCII文件,行数,带此方案: NODE_212_lenght.._1 NODE_212_lenght.._2 NODE_213_lenght.._1 NODE_213_lenght.._2 为了将该文件与每个具有相同节点号的记录分开,我使用了这个单行awk命令 awk -F "_" '{print >("orfs_for_node_" $2 "")}' <file awk-F“{print>

伙计们,我正试图找到一种方法来避免awk错误“打开的文件太多”。我的情况如下:

输入:ASCII文件,行数,带此方案:

NODE_212_lenght.._1
NODE_212_lenght.._2
NODE_213_lenght.._1
NODE_213_lenght.._2
为了将该文件与每个具有相同节点号的记录分开,我使用了这个单行awk命令

awk -F "_" '{print >("orfs_for_node_" $2 "")}' <file

awk-F“{print>('orfs\u代表节点“$2”)}据我所知,您正在寻找关闭该文件的合适时机。对于示例输入内容,您可以执行以下操作:

awk -F "_" 'BEGIN{prefix="orfs_for_node_"} 
NR>1&&$2!=last{close(prefix""last)}{last=$2;print >(prefix$2)}' inputFile
它会检查
$2
是否已更改,然后使用最后一个
$2
关闭文件。这假定文件中的行按
$2


如果未按
$2
排序,请使用
>

据我所知,您正在寻找关闭该文件的适当时机。对于示例输入内容,您可以执行以下操作:

awk -F "_" 'BEGIN{prefix="orfs_for_node_"} 
NR>1&&$2!=last{close(prefix""last)}{last=$2;print >(prefix$2)}' inputFile
它会检查
$2
是否已更改,然后使用最后一个
$2
关闭文件。这假定文件中的行按
$2


如果未按
$2
排序,请使用
>

如果您切换到GNU awk,它将为您处理。否则,如果您的输入文件将每个$2值的所有行分组在一起,则这是正确的语法:

awk -F '_' '{out="orfs_for_node_"$2} out!=prev{close(prev)} {print > out; prev=out}' file
否则,您需要使用
>
而不是

awk -F '_' '{out="orfs_for_node_"$2} out!=prev{close(prev)} {print >> out; prev=out}' file

请注意,在第二种情况下,您需要在运行之前清空任何预先存在的“out”文件(例如,从上一次运行中),因为它将始终附加到输出文件。

如果您切换到GNU awk,它将为您处理。否则,如果您的输入文件将每个$2值的所有行分组在一起,则这是正确的语法:

awk -F '_' '{out="orfs_for_node_"$2} out!=prev{close(prev)} {print > out; prev=out}' file
否则,您需要使用
>
而不是

awk -F '_' '{out="orfs_for_node_"$2} out!=prev{close(prev)} {print >> out; prev=out}' file
请注意,在第二种情况下,您需要在运行之前清空任何预先存在的“out”文件(例如,从上一次运行中),因为它总是附加到输出文件中