Разбить файл на блоки со счетчиком - PullRequest
0 голосов
/ 28 августа 2011

Следующая строка с одним выражением awk позволяет мне разбить файл по символу в позиции 22:

awk -v pdb="${file}" -F "" '{close(c);c=$22}{print > pdb"_"c".pdb"}' ${file}.1tmp 

Мои файлы имеют тип:

ATOM   8911  N   SER W   1      -5.412  94.401  12.569  1.00137.46           N  
ATOM   8912  CA  SER W   1      -4.093  93.709  12.370  1.00137.35           C  
ATOM   8913  C   SER W   1      -3.115  93.771  13.604  1.00137.27           C  
ATOM   8914  O   SER W   1      -2.023  93.177  13.570  1.00137.22           O  
ATOM   8915  CB  SER W   1      -3.417  94.212  11.063  1.00137.29           C  
ATOM      1  N   ASP X   7      70.244 176.432 -72.598  1.00121.87           N  
ATOM      2  CA  ASP X   7      70.164 177.938 -72.649  1.00122.11           C  
ATOM      3  C   ASP X   7      68.705 178.495 -72.843  1.00121.38           C  
ATOM      4  O   ASP X   7      68.482 179.724 -72.941  1.00121.16           O  
ATOM      5  CB  ASP X   7      71.128 178.442 -73.745  1.00122.87           C  
ATOM   5143  N   ASP W   7     -68.623 209.141 -11.831  1.00118.10           N  
ATOM   5144  CA  ASP W   7     -67.698 209.756 -12.845  1.00118.36           C  
ATOM   5145  C   ASP W   7     -66.378 210.288 -12.223  1.00118.02           C  
ATOM   5146  O   ASP W   7     -65.657 211.116 -12.802  1.00118.06           O  
ATOM   5147  CB  ASP W   7     -68.436 210.840 -13.657  1.00118.67           C  

Однако,скрипт копирует все строки с буквой W в 22-й позиции в одном и том же файле, даже если они находятся в несмежных блоках.Я хотел бы разбить файл на блоки так, чтобы первый смежный блок, содержащий W (или любой другой символ), был назван W1, а второй W2 и так далее.Может ли это быть легко сделано с помощью awk, или я должен пойти на цикл со счетчиком или что-то в этом роде?

1 Ответ

1 голос
/ 28 августа 2011
awk -v pdb="${file}" 'BEGIN{f=1} NR==1{n=$5;s[$5]=f} $5!=n{s[$5]=f++ ;n=$5} { print > pdb"_"$5"_"s[$5]".txt" }' ${file}
...