我有一个具有~500个文件的父目录,每个文件名都以cert开头,即cert-104.mol2、cert-105.mol2等等。这些cert文件中的每一个都包含一个七个数字标识符,即7988114。有20个唯一的七个数字标识符。我已经创建了一个目录(unique_ligands),其中包含每个唯一标识符的目录,即一个名为7988114的目录。在每个目录中都有一个带有标识符名称的.mol2文件,即7988114.mol2。总之,文件结构如下所示:
/parent/unique_ligands/7988114/7988114.mol2其中7988114是~20个唯一标识符之一。
在具有~500个文件的父目录中,我需要循环遍历每个cert文件,选择唯一的七个数字标识符,并将其发送到相应的identifier.mol2文件。作为一个开始抨击,我不知道如何处理这一点。我为单个标识符( 7988114 )编写了执行此过程的代码
find . -type f -name 'cert*' -exec grep -q '7988114' {} ';' -exec cp {} ./unique_ligands/7988114 ';'
cd unique_ligands/7988114
bash -c 'cat $(for((i=0;i<10000;i++)); do echo -n "cert-${i}.mol2 "; done) > zzz.txt 2> ./null'
mv zzz.txt 7988114.mol2
rm null
rm cert*我如何将其转换为能够识别任意七个数字标识符的循环?或者有什么更好的方法来解决这个问题?
编辑
为了澄清我上面的示例代码中的每一行都做了什么:
find ...本行搜索以文件名cert开头的所有~500个文件,并选择其内容包含字符串7988114的文件,并将它们复制到正确的7988114目录中。每个cert文件包含大约100行分子坐标、电荷信息等等。
bash -c ...这一行遍历复制到7988114目录中的每个cert文件,并将文件内容添加到一个新的文本文件zzz.txt中。每个cert文件都被命名为cert-1.mol2、cert-2.mol2等。对我来说,最关键的是,这一行搜索从1到10,000的上限的每个cert文件,并按顺序将它们添加到zzz.txt。我发现的其他示例要么没有按顺序进行搜索,要么在查看cert-1*文件之前遍历cert-2*文件。
由于某些原因,不允许我在上面创建一个mv zzz.txt 7988114.mol2文件,所以我在这里创建了它
发布于 2019-10-08 20:47:04
这里有一个方法,我想出了如何回答我自己的问题(在上面用户的帮助和启发下--谢谢!)
ls -l | grep ^d | awk '{print $9}' > list_of_ligands.txt
mv list_of_ligands.txt ..
cd ..
while read NAME
do
echo "$NAME"
grep -l "$NAME" cert* | while read -r filename ; do
cp $filename unique_ligands/$NAME
cd unique_ligands/$NAME
bash -c 'cat $(for((i=0;i<10000;i++)); do echo -n "cert-${i}.mol2 "; done) > zzz.txt 2> ./null'
mv zzz.txt $NAME.mol2
rm null
rm cert*
cd ../..
done
done < list_of_ligands.txt正如我在最初的问题中提到的,我以前为每个7个数字标识符创建了一个目录。ls -l行选择目录名并创建目录名称的垂直列表(同样,目录名只是我拥有的每个7个数字标识符)。
两个while循环遍历我所拥有的每个7个数字标识符,并执行我在最初问题中提到的命令。
https://stackoverflow.com/questions/58252116
复制相似问题