2016-02-05 40 views
2

我有一個文件,其中我需要按順序排列其中一列。我已經訂購了幾行相同但面對齊的問題。我沒有得到如何保持列對齊。如何保持列左對齊在perl

以下是我在哪裏集中在只有6列我的參考文件:

ATOM  1 CA GLY P 12  9.393 37.464 31.388 0.00 0.00  P1  
ATOM  2 CA SER P 13  12.158 39.603 32.954 0.00 0.00  P1 
ATOM  3 CA VAL P 52  41.104 47.186 31.473 0.00 0.00  P1  
ATOM  4 CA GLN P 164  36.217 27.890 29.620 0.00 0.00  P1  
ATOM  5 CA GLN P 165  34.809 29.586 32.649 0.00 0.00  P1  
ATOM  6 CA GLY P 12  10.007 25.374 54.523 0.00 0.00  P2  
ATOM  7 CA SER P 13  13.212 23.440 53.698 0.00 0.00  P2  
ATOM  8 CA ASP P 14  16.884 24.084 54.463 0.00 0.00  P2 

以下是我的代碼:

#!/usr/bin/perl 
use warnings; 
use strict; 

open (DATA, "<try.pdb") or die "not"; 
open (FILE,">file.txt") or die "no"; 
my $n=11; 
foreach my $line1 (<DATA>){ 

if ($line1 =~ m/^ATOM\s+\d+\s+[A-Z]+\s+[A-Z]+\s+P\s+(\d+)/){ 

$line1 =~ s/$1/$n/g; 
print FILE $line1; 
} 
$n++; 
} 

以下是我的輸出,其中的第4和第5行排列得到了改變因爲在參考文件中有三位數字。

ATOM  1 CA GLY P 12  9.393 37.464 31.388 0.00 0.00  P1  
ATOM  2 CA SER P 13  12.158 39.603 32.954 0.00 0.00  P1 
ATOM  41 CA VAL P 14  41.104 47.186 31.473 0.00 0.00  P1  
ATOM 153 CA GLN P 15  36.217 27.890 29.620 0.00 0.00  P1  
ATOM 154 CA GLN P 16  34.809 29.586 32.649 0.00 0.00  P1  
ATOM 155 CA GLY P 17  10.007 25.374 54.523 0.00 0.00  P2  
ATOM 156 CA SER P 18  18.212 23.440 53.698 0.00 0.00  P2  
ATOM 157 CA ASP P 19  16.884 24.084 54.463 0.00 0.00  P2 

回答

0

有兩個解決辦法 - 要麼sprintf設置字段寬度進行打印或使用\t

$line1 = join ("\t", split (' ', $line1)); 

此將其分解的任何空白,並一起再次與製表位堅持回來。應該再次對齊列。

使用sprintf您可以指定一種格式,並允許您配置例如前導零,小數位數或只是字符串對齊。我認爲這對你正在做的事情可能有點矯枉過正。

+0

@Sorbique用戶輸入看起來像PDB格式。大多數pdb文件在原子記錄中不會有空白。所以最好避免使用分割和空白的PDB文件。 – mkHun

+0

@mkHun咦?問題中的示例數據中有空格。 –

+0

@MattJacob示例數據包含空白,但大多數PDB文件沒有空白,例如來自此PDB文件的「ATOM 188 O HIS A 24 19.075 22.262 50.693 1.00108.06 O」(http://www.rcsb.org/) PDB /文件/ 1mkh.pdb)。因此,大多數生物信息學家使用'substr'通過此PDB格式(http://deposit.rcsb.org/adit/docs/pdb_atom_format.html)以固定偏移量和長度提取數據。:) – mkHun

0

腳本有兩個問題。先用3位第六列中的空間對準條目

第二上正則表達式使用g標誌的這則會覆蓋出現這種情況是一樣的第6列

下面的腳本校正這兩個的任何其它數據問題。通過匹配空格和第6列中的數字並代入偶數的空白來克服空間對齊。這將使用$ n最多4位數字,並假設6列中的數字不會出現在第6列之前。如果確實如此,那麼正則表達式會改變第一個數字。

#!/usr/bin/perl 
use warnings; 
use strict; 

open(DATA, "<try.pdb") or die "not"; 

#open (FILE,">file.txt") or die "no"; 
my $n = sprintf("%4d", 98); 
foreach my $line1 (<DATA>) { 

    if ($line1 =~ m/^ATOM\s+\d+\s+[A-Z]+\s+[A-Z]+\s+P(\s+\d+)/) { 

     $line1 =~ s/$1/ $n/; 
     print $line1; 
    } 
    $n++; 
    $n = sprintf("%4d", $n); 
}