使用awk按模式将一个文件分成几个小文件

时间:2018-12-07 05:46:19

标签: awk

我已经阅读了post,有关使用awk将一个文件拆分为几个文件:

我对Pramod和jaypal singh提供的一种解决方案感兴趣:

awk '/^>chr/ {OUT=substr($0,2) ".fa"}; {print >> OUT; close(OUT)}' Input_File

因为我仍然无法添加任何评论,所以我在这里提问。 如果输入是

>chr22
asdgasge
asegaseg
>chr1
aweharhaerh
agse
>chr14
gasegaseg

怎么会产生三个文件:

chr22.fasta  
chr1.fasta  
chr14.fasta

例如,在chr22.fasta中:

>chr22
asdgasge
asegaseg

我了解第一部分

/^>chr/ {OUT=substr($0,2) ".fa"};

和以下命令:

/^>chr/  substr()  close() >>

但是我不明白awk如何将输入分成第二部分:

{print >> OUT; close(OUT)}

有人可以解释有关此命令的更多详细信息吗?非常感谢!

2 个答案:

答案 0 :(得分:2)

能否请您关注以下内容,并告诉我这是否对您有帮助。

public static boolean listEndsWith(List<?> A, List<?> B) {
    if (B.size() > A.size()) {
        return false;
    }

    for (int i = A.size() - B.size(), j = 0; i < A.size(); i++, j++) {
        if (!A.get(i).equals(B.get(j))) {
            return false;
        }
    }

    return true;
}

您也可以从awk ' ##Starting awk program here. /^>chr/{ ##Checking condition if a line starts from string chr then do following. OUT=substr($0,2) ".fa" ##Create variable OUT whose value is substring of current line and starts from letter 2nd to till end. concatenating .fa to it too. } { print >> OUT ##Printing current line(s) in file name whose value is variable OUT. close(OUT) ##using close to close output file whose value if variable OUT value. Basically this is to avoid "TOO MANY FILES OPENED ERROR" error. }' Input_File ##Mentioning Input_file name here. 页获得有关man awk的已使用功能的参考,如下所示。

awk

答案 1 :(得分:2)

您要询问的部分有些不舒服:

{ print $0 >> OUT; close(OUT) }

在这一部分中,awk程序对其处理的每一行执行以下操作

  • 打开文件OUT
  • 将文件指针移动到文件OUT的末尾
  • 在行$0后加上ORS到文件OUT
  • 关闭文件OUT

为什么这不舒服?主要是由于文件的结构。仅应在完成写入后关闭文件,而不是每次写入时都关闭。当前,如果您有100行的Fasta记录,它将打开,关闭文件100次。

更好的方法是:

awk '/^>chr/{close(OUT); OUT=substr($0,2)".fasta" }
     {print > OUT }
     END {close(OUT)}'

在这里,我们仅在第一次写入文件时打开文件,然后在不再需要它时将其关闭。

注意:确实不需要END语句。