【问题标题】:How to close file in awk while generating a list of?生成列表时如何在awk中关闭文件?
【发布时间】:2018-12-15 00:14:59
【问题描述】:

伙计们,我正在尝试找到一种方法来避免出现 awk 错误 "too many open file" 。这是我的情况:

INPUT : ASCII 文件,很多行,使用这个方案:

NODE_212_lenght.._1
NODE_212_lenght.._2
NODE_213_lenght.._1
NODE_213_lenght.._2

为了将这个文件与具有相同 NODE 编号的每条记录分开,我使用了这个单行 awk 命令

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

对于一个由很多行组成的文件,这个命令总是说“打开的文件太多”。我也试过用 2k 线分割,同样的。 我实际上不能低于 2k 行,因为输入的是一个巨大的文件。

我知道 awk 可以关闭在里面做某事后的文件,但我实际上不知道该怎么做。我试过添加

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

但这不会产生任何输出。

【问题讨论】:

    标签: bash text awk


    【解决方案1】:

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

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

    否则你需要使用&gt;&gt;而不是&gt;

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

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

    【讨论】:

      【解决方案2】:

      据我了解,您正在寻找close 文件的合适时机。对于您的示例输入内容,您可以这样做:

      awk -F "_" 'BEGIN{prefix="orfs_for_node_"} 
      NR>1&&$2!=last{close(prefix""last)}{last=$2;print >(prefix$2)}' inputFile
      

      它检查$2 是否更改,然后关闭最后一个$2 的文件。这假设您文件中的行按$2 排序

      如果不是按$2排序,则使用&gt;&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-31
        • 2013-02-11
        • 1970-01-01
        • 2022-01-23
        • 2019-12-18
        • 1970-01-01
        • 2010-09-14
        • 2017-07-11
        相关资源
        最近更新 更多