在 bash 中为多个文件(.PDB 文件)编写一个高效的 for 循环

在 bash 中为多个文件(.PDB 文件)编写一个高效的 for 循环

我对这个脚本有疑问:

#!/bin/bash
for filename in /home/hb/pg/ensemble/pdbs/P24941/raw_pdb/*.pdb; do
    grep COMPND $filename | grep "CHAIN:" -B 1 | sed 's/COMPND//g' | sed 's/CHAIN\://g' | sed 's+[0-9]++g' | sed 's/--//g' | sed 's\MOLECULE:\\g' | sed 's/;/,/g' | sed 'N;s/\(.*\)\n\(.*\)/\2\n\1/' | awk 'NF' | sed 'N;s/\n/ /' > trimmed.csv
mv trimmed.csv /home/hb/pg/ensemble/pdbs/P24941/raw_pdb/trimmed
done

我有大约 800 个这样的 pdb 文件:

> ls -lXGHh --group-directories-first  
total 234M
drwxr-xr-x 1 xx  18K Jun  9 18:13 overall_chains
drwxr-xr-x 1 xx   22 Jun  9 22:13 trimmed
-rw-r--r-- 1 xx    9 May 15 09:43 README.md
-rw-r--r-- 1 xx 224K May  9 10:20 1AQ1.pdb
-rw-r--r-- 1 xx 244K May  9 10:21 1B38.pdb
-rw-r--r-- 1 xx 238K May  9 10:21 1B39.pdb
-rw-r--r-- 1 xx 272K Jun  9 07:19 1BUH.pdb
-rw-r--r-- 1 xx 224K May  9 10:21 1CKP.pdb
-rw-r--r-- 1 xx 222K May  9 10:21 1DI8.pdb
-rw-r--r-- 1 xx 222K May  9 10:21 1DM2.pdb
-rw-r--r-- 1 xx 239K May  9 10:21 1E1V.pdb
...

这是一个示例文件,包含前 20 行:

HEADER    CELL CYCLE                              16-OCT-00   1E9H              
TITLE     THR 160 PHOSPHORYLATED CDK2 - HUMAN CYCLIN A3 COMPLEX WITH            
TITLE    2 THE INHIBITOR INDIRUBIN-5-SULPHONATE BOUND                           
COMPND    MOL_ID: 1;                                                            
COMPND   2 MOLECULE: CELL DIVISION PROTEIN KINASE 2;                            
COMPND   3 CHAIN: A, C;                                                         
COMPND   4 SYNONYM: CYCLIN-DEPENDENT KINASE 2, CDK2;                            
COMPND   5 EC: 2.7.1.37;                                                        
COMPND   6 ENGINEERED: YES;                                                     
COMPND   7 OTHER_DETAILS: PHOSPHORYLATED ON THR 160 CHAINS A AND C              
COMPND   8  ARE ASYMETRIC UNIT COPIES;                                          
COMPND   9 MOL_ID: 2;                                                           
COMPND  10 MOLECULE: CYCLIN A3;                                                 
COMPND  11 CHAIN: B, D;                                                         
COMPND  12 SYNONYM: A3;                                                         
COMPND  13 ENGINEERED: YES;                                                     
COMPND  14 OTHER_DETAILS: TRUNCATED FRAGMENT OF CYCLIN A. IN COMPLEX            
COMPND  15  WITH CDK2 CHAINS B AND D ARE ASYMETRIC UNIT COPIES                  
SOURCE    MOL_ID: 1;                                                            
SOURCE   2 ORGANISM_SCIENTIFIC: HOMO SAPIENS;

我想运行简单的脚本来读取每个“.PDB”文件收集并更新单个 csv 文件及其输出。

我可以实现单个文件的输出:

grep COMPND 1E9H.pdb | grep "CHAIN:" -B 1 | sed 's/COMPND//g' | sed 's/CHAIN\://g' | sed 's+[0-9]++g' | sed 's/--//g' | sed 's\MOLECULE:\\g' | sed 's/;/,/g' | sed 'N;s/\(.*\)\n\(.*\)/\2\n\1/' | awk 'NF' | sed 'N;s/\n/ /'

该单个文件的输出为:

A, C,             CELL DIVISION PROTEIN KINASE ,                            
CYCLIN A, B, D,

我想修剪目录中的所有 pdb 文件,然后将它们移动到特定目录(修剪后的目录)。有什么解决方案吗?

谢谢大家的回答。

我尝试编写 bash 脚本,但我只得到了一行 csv 文件。

答案1

(首先,一个问题:为什么要有命令mv而不是直接写入所需的路径?)

有两种基本方法可以实现此目的:附加到输出文件而不是覆盖它,>>而是使用>

for i in *.pdb; do
  echo processing "$i" >> for-loop-output.txt
done

您还可以将输出重定向放在其他地方:

for i in *.pdb; do
  echo processing "$i"
done > for-loop-output.txt

后者可能效率更高,因为输出文件仅打开一次。但是,对于只有 800 个文件的情况,这并不重要。

相关内容