【问题标题】:How to keep the column left aligned in perl如何在perl中保持列左对齐
【发布时间】:2016-05-15 11:13:47
【问题描述】:

我有一个文件,我需要在其中按顺序排列其中一列。我订购了相同的产品,但面临几行对齐问题。我不知道如何保持列对齐。

以下是我的参考文件,我只关注第 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

【问题讨论】:

    标签: regex perl


    【解决方案1】:

    对此有两种解决方案 - sprintf 设置打印字段宽度或使用 \t

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

    这会将其拆分为任何空白,并使用制表位将其重新组合在一起。哪个应该再次左对齐您的列。

    使用sprintf,您可以指定格式,并允许您配置例如前导零、小数位数或只是字符串对齐。我认为这对你正在做的事情来说可能有点矫枉过正。

    【讨论】:

    • @Sorbique 用户输入看起来像 PDB 格式。大多数 pdb 文件在原子记录中不会有空格。所以最好避免对 PDB 文件使用带空格的拆分。
    • @mkHun 嗯?问题的示例数据中有空格。
    • @MattJacob 示例数据包含空格,但大多数 PDB 文件没有空格,例如来自此 PDB 文件 (rcsb.org/pdb/files/1mkh.pdb) 的 ATOM 188 O HIS A 24 19.075 22.262 50.693 1.00108.06 O。所以大多数生物信息学家使用substr通过这个PDB FORMAT(deposit.rcsb.org/adit/docs/pdb_atom_format.html)的固定偏移和长度提取数据:)
    【解决方案2】:

    您的脚本有两个问题。首先是与第 3 位第 6 列条目的空间对齐

    第二次在正则表达式上使用 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 );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-19
      • 1970-01-01
      • 2018-02-26
      • 2022-01-21
      • 1970-01-01
      • 2019-02-07
      • 2020-08-15
      • 2014-05-27
      相关资源
      最近更新 更多