我已经阅读了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)}
有人可以解释有关此命令的更多详细信息吗?非常感谢!
答案 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
语句。