检查字符串是否存在于给定列的非连续行中

时间:2011-08-26 13:04:53

标签: bash duplicates lines

我的文件格式如下:

ATOM   8962  CA  VAL W   8       8.647  81.467  25.656  1.00115.78           C  
ATOM   8963  C   VAL W   8      10.053  80.963  25.506  1.00114.60           C  
ATOM   8964  O   VAL W   8      10.636  80.422  26.442  1.00114.53           O  
ATOM   8965  CB  VAL W   8       7.643  80.389  25.325  1.00115.67           C  
ATOM   8966  CG1 VAL W   8       6.476  80.508  26.249  1.00115.54           C  
ATOM   8967  CG2 VAL W   8       7.174  80.526  23.886  1.00115.26           C  
ATOM   4440  O   TYR S  89       4.530 166.005 -14.543  1.00 95.76           O  
ATOM   4441  CB  TYR S  89       2.847 168.812 -13.864  1.00 96.31           C  
ATOM   4442  CG  TYR S  89       3.887 169.413 -14.756  1.00 98.43           C  
ATOM   4443  CD1 TYR S  89       3.515 170.073 -15.932  1.00100.05           C  
ATOM   4444  CD2 TYR S  89       5.251 169.308 -14.451  1.00100.50           C  
ATOM   4445  CE1 TYR S  89       4.464 170.642 -16.779  1.00100.70           C  
ATOM   4446  CE2 TYR S  89       6.219 169.868 -15.298  1.00101.40           C  
ATOM   4447  CZ  TYR S  89       5.811 170.535 -16.464  1.00100.46           C  
ATOM   4448  OH  TYR S  89       6.736 171.094 -17.321  1.00100.20           O  
ATOM   4449  N   LEU S  90       3.944 166.393 -12.414  1.00 94.95           N  
ATOM   4450  CA  LEU S  90       5.079 165.622 -11.914  1.00 94.44           C  
ATOM   5151  N   LEU W   8     -66.068 209.785 -11.037  1.00117.44           N  
ATOM   5152  CA  LEU W   8     -64.800 210.035 -10.384  1.00116.52           C  
ATOM   5153  C   LEU W   8     -64.177 208.641 -10.198  1.00116.71           C  
ATOM   5154  O   LEU W   8     -64.513 207.944  -9.241  1.00116.99           O  
ATOM   5155  CB  LEU W   8     -65.086 210.682  -9.033  1.00115.76           C  
ATOM   5156  CG  LEU W   8     -64.274 211.829  -8.478  1.00113.89           C  
ATOM   5157  CD1 LEU W   8     -64.528 211.857  -7.006  1.00111.94           C  
ATOM   5158  CD2 LEU W   8     -62.828 211.612  -8.739  1.00112.96           C  

原则上,第5列(W,在这种情况下,表示链ID)应仅在连续的块中相同。但是,在链数太多的文件中,没有足够的字母表来为每个链分配一个ID,因此可能存在两面性。

我希望能够检查是否是这种情况。换句话说,我想知道给定的链ID(A-Z,总是在第5列中)是否存在于非连续的块中。我不介意它是否从W变为S,我想知道是否有两个块共享相同的链ID。在这种情况下,如果W或S在某个时刻再次出现。事实上,如果他们也分享第一列和第六列,这只是一个问题,但我不想太复杂化。

我不想打印这些行,只是想知道发生问题的文件的名称和链ID(在本例中为W),以便解决问题。事实上,我已经知道如何解决这个问题了,但我需要确定有问题的文件,专注于那些文件,而不是修复已经健全的文件。

解决方案(感谢所有人的帮助,即谢谢):

for pdb in $(ls *.pdb) ; do
hit=$(awk -v pdb="$pdb" '{ if ( $1 == "ATOM" ) { print $0 } }' $pdb | cut -c22-23 | uniq | sort | uniq -dc)
[ "$hit" ] && echo $pdb = $hit
done

3 个答案:

答案 0 :(得分:1)

对于这个特定的样本:

cut -c22-23 t | uniq | sort | uniq -dc

将输出

2 W

第22列包含2个字母'W'的运行)

答案 1 :(得分:0)

未测试

awk '
    seen[$5] && $5 != current {
        print "found non-consecutive chain on line " NR
        exit
    }
    { current = $5; seen[$5] = 1 }
' filename

答案 2 :(得分:0)

在这里,这个awk脚本经过测试,不仅考虑'W':

{
    if (ln[$5] && ln[$5] + 1 != NR) {
        print "dup " $5 " at line " NR;
    }
    ln[$5] = NR;
}