2013-05-15 72 views
0

我有一个包含200个pdb文件的文件夹。我想根据第6列以升序排列PDB文件的原子线。我想为文件夹中的每个pdb文件进行就地编辑。你的帮助将不胜感激。如何按照升序排列

ATOM  81 N ASN A 248  38.791 -16.708 12.507 1.00 52.04   N 
ATOM  82 CA ASN A 248  39.443 -17.018 11.206 1.00 54.49   C 
ATOM 422 C SER A 205  70.124 -29.955 8.226 1.00 55.81   C 
ATOM 423 O SER A 205  70.901 -29.008 8.438 1.00 46.60   O 
ATOM 303 N MET A 231  61.031 -38.086 -3.054 1.00 52.32   N 
ATOM 304 CA MET A 231  60.580 -39.074 -4.047 1.00 64.11   C 
ATOM 392 C GLU B 65  23.248 10.071 -7.321 1.00 48.26   C 
ATOM 393 O GLU B 65  24.465 10.200 -7.158 1.00 46.53   O 
ATOM 394 O GLU B 65  24.465 10.200 -7.158 1.00 46.53   O 

所需的输出

ATOM 392 C GLU B 65  23.248 10.071 -7.321 1.00 48.26   C 
ATOM 393 O GLU B 65  24.465 10.200 -7.158 1.00 46.53   O 
ATOM 394 O GLU B 65  24.465 10.200 -7.158 1.00 46.53   O 
ATOM 422 C SER A 205  70.124 -29.955 8.226 1.00 55.81   C 
ATOM 423 O SER A 205  70.901 -29.008 8.438 1.00 46.60   O 
ATOM 303 N MET A 231  61.031 -38.086 -3.054 1.00 52.32   N 
ATOM 304 CA MET A 231  60.580 -39.074 -4.047 1.00 64.11   C 
ATOM  81 N ASN A 248  38.791 -16.708 12.507 1.00 52.04   N 
ATOM  82 CA ASN A 248  39.443 -17.018 11.206 1.00 54.49   C 

回答

4

使用sort

sort -n -k 6 inputfile 

-n进行数字排序,并-k讲述通过一键排序。

编辑:对于就地分拣,使用-o选项:

+0

+1。替代形式:'sort -k 6n,6 inputfile'。其实它不会就地编辑。试试''perl -i',这样做。 – TrueY

+1

另一种替代方法是:'sort -nk6 inputfile'。 – devnull

+0

@devnull谢谢你的回答。我想为多个文件进行就地编辑。我怎样才能改变你的代码? – user2374784

0

我用一个散列结果,其中关键将是第6场加上递增附加在末尾的每一行的计数器。这样可以避免覆盖重复的条目并保持稳定的顺序。然后使用asorti()函数按第6个字段排序并打印原始数组的每一行。

{ 
     ++n 
     data[ $6 _ n ] = $0; 
} 

END { 
     asorti(data, mod_data, "@ind_num_asc") 
     l = length(data) 
     for (i = 1; i <= l; i++) { 
       print data[ mod_data[i] ] 
     } 
} 

运行它喜欢:的script.awk

内容

awk -f script.awk infile 

国债收益率:

ATOM 392 C GLU B 65  23.248 10.071 -7.321 1.00 48.26   C 
ATOM 393 O GLU B 65  24.465 10.200 -7.158 1.00 46.53   O 
ATOM 394 O GLU B 65  24.465 10.200 -7.158 1.00 46.53   O 
ATOM 422 C SER A 205  70.124 -29.955 8.226 1.00 55.81   C 
ATOM 423 O SER A 205  70.901 -29.008 8.438 1.00 46.60   O 
ATOM 303 N MET A 231  61.031 -38.086 -3.054 1.00 52.32   N 
ATOM 304 CA MET A 231  60.580 -39.074 -4.047 1.00 64.11   C 
ATOM  81 N ASN A 248  38.791 -16.708 12.507 1.00 52.04   N 
ATOM  82 CA ASN A 248  39.443 -17.018 11.206 1.00 54.49   C 
+0

谢谢你的回答。你的代码不适合我。 – user2374784

+0

@ user2374784:您将需要GNU版本。否则,我认为'asorti()'不起作用。 – Birei