Изменить столбец в соответствии с предыдущей строкой с условиями - PullRequest
1 голос
/ 26 августа 2011

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

ATOM   3736  CB  THR A 486      -6.552 153.891  -7.922  1.00115.15           C  
ATOM   3737  OG1 THR A 486      -6.756 154.842  -6.866  1.00114.94           O  
ATOM   3738  CG2 THR A 486      -7.867 153.727  -8.636  1.00115.11           C  
ATOM   3739  OXT THR A 486      -4.978 151.257  -9.140  1.00115.13           O  
HETATM10351  C1  NAG B 203      33.671  87.279  39.456  0.50 90.22           C  
HETATM10483  C1  NAG Z 702      28.025 104.269 -27.569  0.50 92.75           C    
ATOM   3736  CB  THR X 486      -6.552  86.240   7.922  1.00115.15           C  
ATOM   3737  OG1 THR X 486      -6.756  85.289   6.866  1.00114.94           O  
ATOM   3738  CG2 THR X 486      -7.867  86.404   8.636  1.00115.11           C  
ATOM   3739  OXT THR X 486      -4.978  88.874   9.140  1.00115.13           O  
HETATM10351  C1  NAG Y 203      33.671 152.852 -39.456  0.50 90.22           C  
HETATM10639  C2  FUC C 402     -48.168 162.221 -22.404  0.50103.03           C  

Для каждого блока строк, начинающегося с HETATM *, я хотел бы изменить столбец 5, чтобы он соответствовал столбцу предыдущего блока ATOM.Это означает, что для первого блока HETATM * оба B и Z изменятся на A, тогда как для второго блока HETATM * оба Y и C изменятся на X.

Второй вопрос, мне на самом деле не нужносделайте это, просто из любопытства, как бы я разбил файл после каждой строки, начинающейся с HETATM *, но только если следующая строка - ATOM?

Ответы [ 3 ]

2 голосов
/ 26 августа 2011
awk '$1=="ATOM"{c=$5}/^HETATM/{ $5=c };1' file

Для экономии места используйте разделитель полей

awk -F" " '/^ATOM/{c=$5}/^HETATM/{ $5=c };1' file
2 голосов
/ 26 августа 2011

Попробуйте это:

awk '{
  if( $1 == "ATOM" ) {
    col5=$5;
  } 
  else if( match($1,/HETATM[0-9]*/)) {
    $5=col5;
  }
  print 
}' < infile
1 голос
/ 27 августа 2011

Вот мое решение, которое решает первую проблему (замену пятого поля) при сохранении пробелов:

$1=="ATOM" {
    fifthField=$5

    # Block to determine which index position field #5 is
    fifthField_index = 1
    for (i = 0; i < 4; i++) {
        // Skip until white space
        for (; substr($0, fifthField_index, 1) != " "; fifthField_index++) { }
        // Skip white spaces
        for (; substr($0, fifthField_index, 1) == " "; fifthField_index++) { }
    }

    print;next
}

/^HETATM/ {
    before_fifthField = substr($0, 1, fifthField_index - 1)
    after_fifthField = substr($0, fifthField_index + 1, length($0))
    print before_fifthField fifthField after_fifthField
    next
}

1

Это не самое элегантное решение, но оно работает.Это решение предполагает, что пятое поле представляет собой один символ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...