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