Bash 基于数组将文件拆分为不同的文件

Bash 基于数组将文件拆分为不同的文件,bash,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-En

我有一个文件如下所示:

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,
我可能
grep
独特的注释并将其输出到文件,但我相信这可能是一种最优雅的方式

谢谢

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

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

但是,我只做了一个注释

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

awk '{print >$4".annotation"}' file.list
Awk隐式地逐行读取文件。这里,我们使用一个
print
语句,其输出被重新定向到一个文件,该文件的名称由第四个字段组成,并添加了后缀
.annotation

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

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

按如下方式修复您的循环:“${myARRAY[@]}”中ann的
;执行…
awk '{fname=$4".annotation"; print>fname; close(fname)}' file.list