根据数组

时间:2016-09-01 18:43:04

标签: bash

我有一个看起来像这样的文件:

1   10000   10400   GI.STMC.GAST-EnhA
1   10000   10400   SKIN.PEN.FRSK.FIB.02-EnhA 
1   10000   10400   BRN.DL.PRFRNTL.CRTX-EnhA
1   10000   10400   BRN.ANT.CAUD-EnhA
1   10000   10400   HRT.ATR.R-EnhA 
1   10200   10400   ESDR.H1.MSC-EnhA
1   10200   10400   GI.ESO-EnhA
1   10200   10400   GI.DUO.SM.MUS-EnhA
1   10200   10400   LNG-EnhA
1   14800   15200   MUS.TRNK.FET-EnhA

我想根据第4列中的注释拆分文件,我可以使用以下代码提取唯一注释:

sort -u file.list > annotation.list # file.list file with the different annotations

我可以将注释中的信息存储在数组中:

 mapfile -t myARRAY < annotation.list,

但是,我不知道如何将文件拆分为仅包含注释的不同文件,例如,包括注释&#34; ADRL.GLND.FET-TssA&#34;:

1   713800  714800  ADRL.GLND.FET-TssA
1   762000  763200  ADRL.GLND.FET-TssA 
1   948600  948800  ADRL.GLND.FET-TssA
1   1166800 1167400 ADRL.GLND.FET-TssA
1   1208600 1208800 ADRL.GLND.FET-TssA
1   1243400 1243800 ADRL.GLND.FET-TssA
1   1244000 1244200 ADRL.GLND.FET-TssA
1   1284000 1284400 ADRL.GLND.FET-TssA
1   1310200 1310400 ADRL.GLND.FET-TssA
1   1310800 1311200 ADRL.GLND.FET-TssA

我可以grep使用唯一注释并将其输出到文件中,但我相信这可能是最优雅的方式,

由于

编辑:到目前为止我有这个

mapfile -t myARRAY < annotation.list;
for ann in ${myARRAY}; do
     grep ${ann} roadmap.core_active.bed > ${ann}.annotation
done

但是,我只有一个注释

1 个答案:

答案 0 :(得分:1)

这将创建您要求的每个注释文件:

awk '{print >$4".annotation"}' file.list

Awk隐式地逐行读取文件。在这里,我们使用print语句,将其输出重定向到一个文件,该文件的名称由添加了后缀.annotation的第四个字段组成。

除非有大量不同的注释,否则上述内容将起作用。在这种情况下,您可能会达到打开文件的系统限制。为避免这种情况,我们需要明确地关闭文件:

awk '{fname=$4".annotation"; print>fname; close(fname)}' file.list