LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Linux - General (https://www.linuxquestions.org/questions/linux-general-1/)
-   -   Incrementing Column alphabetically (https://www.linuxquestions.org/questions/linux-general-1/incrementing-column-alphabetically-891337/)

mzh 07-12-2011 01:37 PM

Incrementing Column alphabetically
 
Dear Forum,
Lets say, I have a file structured like this:
Code:

MODEL        1
 ATOM      1  N  LYS A  3      31.221  22.957  43.101  1.00 54.39          N
 ATOM      2  CA  LYS A  3      31.828  24.118  42.476  1.00 49.68          C
 ATOM      3  C  LYS A  3      31.979  23.854  41.021  0.00 48.07          C
 ATOM    963  OG1 THR A 125      35.484  35.831  24.497  0.00 27.99          O
 ATOM    964  CG2 THR A 125      33.105  35.742  24.150  0.00 27.99          C
[...]
 TER    965      THR A 125
 ATOM    966  N  ARG B  2      63.476  8.426  12.454  0.00 60.90          N
 ATOM    967  CA  ARG B  2      64.895  8.182  12.295  1.00 66.32          C
 ATOM    968  C  ARG B  2      65.347  6.986  13.094  1.00 65.20          C
 HETATM 2023  O  HOH B 545      66.492  13.204  20.035  1.00 48.25          O
 HETATM 2024  O  HOH B 546      43.799  -1.641  46.084  1.00 69.42          O
[...]
 ENDMDL
 MODEL        2
 ATOM      1  N  LYS A  3      48.929 -22.957  43.101  1.00 54.39          N
 ATOM      2  CA  LYS A  3      48.322 -24.118  42.476  1.00 49.68          C
 ATOM    963  OG1 THR A 125      44.666 -35.831  24.497  0.00 27.99          O
 ATOM    964  CG2 THR A 125      47.045 -35.742  24.150  0.00 27.99          C
[...]
 TER    965      THR A 125
 ATOM    966  N  ARG B  2      16.674  -8.426  12.454  0.00 60.90          N
 ATOM    967  CA  ARG B  2      15.255  -8.182  12.295  1.00 66.32          C
 HETATM 2023  O  HOH B 545      13.658 -13.204  20.035  1.00 48.25          O
 HETATM 2024  O  HOH B 546      36.351  1.641  46.084  1.00 69.42          O
[...]
 ENDMDL
 MASTER      14    0    0    2  18    0  15    9 2022    2    0  20
 END

As you can see, there are various columns with data (its a file describing a molecular protein structure, in total around 4000 lines).
What I require is to change the A's and B's in the 5 column, whenever a 'TER' or 'ENDMDL' keyword appears.
So the file above should be like this:
Code:

ATOM      1  N  LYS A  3      31.221  22.957  43.101  1.00 54.39          N
 ATOM      2  CA  LYS A  3      31.828  24.118  42.476  1.00 49.68          C
 ATOM    964  CG2 THR A 125      33.105  35.742  24.150  0.00 27.99          C
[...]
 ATOM    966  N  ARG B  2      63.476  8.426  12.454  0.00 60.90          N
 ATOM    967  CA  ARG B  2      64.895  8.182  12.295  1.00 66.32          C
 ATOM    968  C  ARG B  2      65.347  6.986  13.094  1.00 65.20          C
 HETATM 2023  O  HOH B 545      66.492  13.204  20.035  1.00 48.25          O
 HETATM 2024  O  HOH B 546      43.799  -1.641  46.084  1.00 69.42          O
[...]
 ATOM      1  N  LYS C  3      48.929 -22.957  43.101  1.00 54.39          N
 ATOM      2  CA  LYS C  3      48.322 -24.118  42.476  1.00 49.68          C
 ATOM    963  OG1 THR C 125      44.666 -35.831  24.497  0.00 27.99          O
[...]
 ATOM    966  N  ARG D  2      16.674  -8.426  12.454  0.00 60.90          N
 ATOM    967  CA  ARG D  2      15.255  -8.182  12.295  1.00 66.32          C
 HETATM 2023  O  HOH D 545      13.658 -13.204  20.035  1.00 48.25          O

Now, the letter descriptor, the "chain id" has been changed from A/B to A/B/C/D (I ommitted a couple of lines, but the change happens at every 'TER' or 'ENDMDL' keyword). The 'TER', 'MODEL' and 'ENDMDL' lines are also not essential.
Is there a smart way to do this?

Thanks a lot for any help.
Martin

druuna 07-12-2011 02:09 PM

Hi,

Infile has +/- 4000 lines, each individual block seems to be +/- 6 lines. You would need around 666 unique tokens.

The alphabet has 26 letters, what needs to happen when it reached Z?

mzh 07-13-2011 02:37 AM

Quote:

Originally Posted by druuna (Post 4412963)
Hi,

Infile has +/- 4000 lines, each individual block seems to be +/- 6 lines. You would need around 666 unique tokens.

The alphabet has 26 letters, what needs to happen when it reached Z?

Hey, thanks for the feedback. True, you're right. I edited my post above to make it more clear. Its 4000 lines in the file, and in total 4 blocks, so e.g. the 'A' block of the first model is roughly 1000 lines. At the end, there would be four blocks of each around 1000 lines. Each with a unique chain descriptor: A, B, C, D.
Sorry for the confusion.

druuna 07-13-2011 03:35 AM

Hi,

Here's a (long) oneliner that should do what you want/need:
Code:

awk 'BEGIN { l[1] = "A" ; l[2] = "B" ; l[3] = "C" ; l[4] = "D" ; x = 1 } /( TER| ENDMDL)/ { x++ } /(ATOM|HETATM)/ { print $1 "\t" $2 "\t" $3 "t" $4 "\t" l[x] "\t" $6 "\t" $7 "\t" $8 "\t" $9 "\t" $10 "\t" $11 "\t" $12 }' infile
Example run:
Code:

$ cat infile
MODEL        1
 ATOM      1  N  LYS A  3      31.221  22.957  43.101  1.00 54.39          N
 ATOM      2  CA  LYS A  3      31.828  24.118  42.476  1.00 49.68          C
 ATOM      3  C  LYS A  3      31.979  23.854  41.021  0.00 48.07          C
 ATOM    963  OG1 THR A 125      35.484  35.831  24.497  0.00 27.99          O
 ATOM    964  CG2 THR A 125      33.105  35.742  24.150  0.00 27.99          C
 TER    965      THR A 125
 ATOM    966  N  ARG B  2      63.476  8.426  12.454  0.00 60.90          N
 ATOM    967  CA  ARG B  2      64.895  8.182  12.295  1.00 66.32          C
 ATOM    968  C  ARG B  2      65.347  6.986  13.094  1.00 65.20          C
 HETATM 2023  O  HOH B 545      66.492  13.204  20.035  1.00 48.25          O
 HETATM 2024  O  HOH B 546      43.799  -1.641  46.084  1.00 69.42          O
 ENDMDL
 MODEL        2
 ATOM      1  N  LYS A  3      48.929 -22.957  43.101  1.00 54.39          N
 ATOM      2  CA  LYS A  3      48.322 -24.118  42.476  1.00 49.68          C
 ATOM    963  OG1 THR A 125      44.666 -35.831  24.497  0.00 27.99          O
 ATOM    964  CG2 THR A 125      47.045 -35.742  24.150  0.00 27.99          C
 TER    965      THR A 125
 ATOM    966  N  ARG B  2      16.674  -8.426  12.454  0.00 60.90          N
 ATOM    967  CA  ARG B  2      15.255  -8.182  12.295  1.00 66.32          C
 HETATM 2023  O  HOH B 545      13.658 -13.204  20.035  1.00 48.25          O
 HETATM 2024  O  HOH B 546      36.351  1.641  46.084  1.00 69.42          O
 ENDMDL
 MASTER      14    0    0    2  18    0  15    9 2022    2    0  20
 END

$ awk 'BEGIN { l[1] = "A" ; l[2] = "B" ; l[3] = "C" ; l[4] = "D" ; x = 1 } /( TER| ENDMDL)/ { x++ } /(ATOM|HETATM)/ { print $1 "\t" $2 "\t" $3 "t" $4 "\t" l[x] "\t" $6 "\t" $7 "\t" $8 "\t" $9 "\t" $10 "\t" $11 "\t" $12 }' infile
ATOM    1      NtLYS  A      3      31.221  22.957  43.101  1.00    54.39  N
ATOM    2      CAtLYS  A      3      31.828  24.118  42.476  1.00    49.68  C
ATOM    3      CtLYS  A      3      31.979  23.854  41.021  0.00    48.07  C
ATOM    963    OG1tTHR A      125    35.484  35.831  24.497  0.00    27.99  O
ATOM    964    CG2tTHR A      125    33.105  35.742  24.150  0.00    27.99  C
ATOM    966    NtARG  B      2      63.476  8.426  12.454  0.00    60.90  N
ATOM    967    CAtARG  B      2      64.895  8.182  12.295  1.00    66.32  C
ATOM    968    CtARG  B      2      65.347  6.986  13.094  1.00    65.20  C
HETATM  2023    OtHOH  B      545    66.492  13.204  20.035  1.00    48.25  O
HETATM  2024    OtHOH  B      546    43.799  -1.641  46.084  1.00    69.42  O
ATOM    1      NtLYS  C      3      48.929  -22.957 43.101  1.00    54.39  N
ATOM    2      CAtLYS  C      3      48.322  -24.118 42.476  1.00    49.68  C
ATOM    963    OG1tTHR C      125    44.666  -35.831 24.497  0.00    27.99  O
ATOM    964    CG2tTHR C      125    47.045  -35.742 24.150  0.00    27.99  C
ATOM    966    NtARG  D      2      16.674  -8.426  12.454  0.00    60.90  N
ATOM    967    CAtARG  D      2      15.255  -8.182  12.295  1.00    66.32  C
HETATM  2023    OtHOH  D      545    13.658  -13.204 20.035  1.00    48.25  O
HETATM  2024    OtHOH  D      546    36.351  1.641  46.084  1.00    69.42  O

Hope this helps.

mzh 07-13-2011 03:57 AM

awesome.

druuna 07-13-2011 04:16 AM

:)

If you need any help with the one-liner just let me know.

BTW: If this is solved, can you put up the solved tag (first post -> Thread Tools).


All times are GMT -5. The time now is 06:05 AM.