【发布时间】:2021-01-23 08:18:43
【问题描述】:
我需要根据名称将 12000 个填充物分类为 1000 个组,并为每个组创建一个包含该组填充物的新文件夹。每个文件的名称以多列格式给出(带 _ 分隔符),其中第二列从 1 到 12(部分编号)变化,最后一列从 1 到 1000(系统编号),表明最初 1000 个不同的系统(最后一列)被分成 12 个单独的部分(第二列)。 这是一个基于 3 个系统的小子集的示例,该系统由 12 个部分划分,总共 36 个填充。
7000_01_lig_cne_1.dlg
7000_02_lig_cne_1.dlg
7000_03_lig_cne_1.dlg
...
7000_12_lig_cne_1.dlg
7000_01_lig_cne_2.dlg
7000_02_lig_cne_2.dlg
7000_03_lig_cne_2.dlg
...
7000_12_lig_cne_2.dlg
7000_01_lig_cne_3.dlg
7000_02_lig_cne_3.dlg
7000_03_lig_cne_3.dlg
...
7000_12_lig_cne_3.dlg
我需要根据它们名称的第二列 (01, 02, 03 .. 12) 对这些填充进行分组,从而创建 1000 个文件夹,这些文件夹应按以下方式为每个系统约束 12 个填充:
Folder1, name: 7000_lig_cne_1, it contains 12 filles: 7000_{this is from 01 to 12}_lig_cne_1.dlg
Folder2, name: 7000_lig_cne_2, it contains 12 filles 7000_{this is from 01 to 12}_lig_cne_2.dlg
...
Folder1000, name: 7000_lig_cne_1000, it contains 12 filles 7000_{this is from 01 to 12}_lig_cne_1000.dlg
假设所有 *.dlg 填充都存在于同一个目录中,我建议 bash 循环工作流,它只缺少一些排序功能(sed、awk ??),按以下方式组织:
#set the name of folder with all DLG
home=$PWD
FILES=${home}/all_DLG/7000_CNE
# set the name of protein and ligand library to analyse
experiment="7000_CNE"
#name of the output
output=${home}/sub_folders_to_analyse
#now here all magic comes
rm -r ${output}
mkdir ${output}
# sed sollution
for i in ${FILES}/*.dlg # define this better to suit your needs
do
n=$( <<<"$i" sed 's/.*[^0-9]\([0-9]*\)\.dlg$/\1/' )
# move the file to proper dir
mkdir -p ${output}/"${experiment}_lig$n"
cp "$i" ${output}/"${experiment}_lig$n"
done
!注意:我将每个文件夹的名称开头表示为 ${experiment} 我在末尾添加了最后一列 $n 的编号。是否可以每次根据复制的填充名称自动设置新文件夹的名称?手动可以通过跳过文件夹名称中的第二列来实现
cp ./all_DLG/7000_*_lig_cne_987.dlg ./output/7000_lig_cne_987
【问题讨论】:
-
Folder1000, name: 7000_lig_cne_3?认为您的意思是Folder1000, name: 7000_lig_cne_1000或Folder3, name: 7000_lig_cne_3?some sorting expression为什么你需要排序文件?您不需要文件之间的顺序 - 只需将文件移动到正确的目录!。 -
是的,你是对的,我更正了我的信息。是的,我只需要移动填充对不起我找不到另一个合适的表达方式.. mb 而是根据文件名重定向??
标签: bash shell sorting awk sed