Проверьте, существует ли строка в непоследовательных строках в данном столбце - PullRequest
0 голосов
/ 26 августа 2011

У меня есть файлы в следующем формате:

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, в данном случае, который представляет идентификатор цепи) должен быть идентичен только в последовательных фрагментах. Однако в файлах со слишком большим количеством цепочек недостаточно букв алфавита, чтобы присвоить один идентификатор каждой цепочке, и, следовательно, может возникнуть двуличие.

Я бы хотел проверить, так ли это на самом деле. Другими словами, я хотел бы знать, присутствует ли данный идентификатор цепочки (A-Z, всегда в 5-м столбце) в непоследовательных фрагментах. Я не против, если он изменится с W на S, я хотел бы знать, есть ли два куска, имеющих один и тот же идентификатор цепи. В этом случае, если W или S появятся в какой-то момент. На самом деле, это проблема, только если они разделяют первый и шестой столбцы, но я не хочу слишком усложнять ситуацию.

Я не хочу печатать строки, просто чтобы узнать имя файла, в котором возникает проблема, и идентификатор цепи (в данном случае 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 ]

1 голос
/ 26 августа 2011

Для этого конкретного образца:

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

Будет выводить

2 W

( 22-й столбец содержит 2 серии буквы «W» )

0 голосов
/ 26 августа 2011

Вот, пожалуйста, этот awk-скрипт протестирован и учитывает не только «W»:

{
    if (ln[$5] && ln[$5] + 1 != NR) {
        print "dup " $5 " at line " NR;
    }
    ln[$5] = NR;
}
0 голосов
/ 26 августа 2011

не проверено

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